hpuoj 问题 C: 善良的国王【最小生成树kurskal】

问题 C: 善良的国王

时间限制: 1 Sec  内存限制: 128 MB
提交: 112  解决: 48
[提交][状态][讨论版]

题目描述

很久很久以前,有一个贫困的国家,这个国家有一个善良爱民的国王,但是国运维艰,这个国家总是不得不面对这天灾的严峻挑战,又一次连月的大雨,引发了洪水,洪水冲断了道路,水褪去后也有很多村庄成为了孤岛,善良的国王爱民如子,于是他想从本不富足的税收中拿出一部分钱,来给这些村庄修道路,但是国力有限,不能修复所有的道路,于是国王决定,保证村庄两两之间可以到达就好。现在国王想知道他要建的道路中最长的最少要多长。

输入

输入包含多组测试数据,每组测试数据首先输入一个n,表示有n个村庄3 <= n <= 500,编号为1-n,然后下边一个n*n的矩阵,第i行第j列的值,表示标号i到编号j的村庄的距离是这个值,单位1~65536

输出

输出国王要建的道路中最长的最少的长度。

样例输入

3
0 990 692
990 0 179
692 179 0

样例输出

692

简单最小生成树,求出最小生成树中的最长边:用kurskal算法在加边时多写一个用于求最长边的步骤即可用 prime算法也是如此,这里就不写prime了
kurskal算法:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 1100
#define maxn(x,y)(x>y?x:y)
#define INF 0x3f3f3f
using namespace std;
int n,k,maxx;
int set[MAX],map[MAX][MAX];
struct node
{
	int b;
	int e;
	int m;
}s[MAX];
bool cmp(node a,node b)
{
	return a.m<b.m;
}
int find(int fa)
{
    if(fa==set[fa])
    return fa;
	return set[fa]=find(set[fa]); 
}
void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	set[fx]=fy;
}
void init()
{
	int i,j;
	for(i=1;i<=n;i++)
	    set[i]=i;
}

void getmap()
{
	int i,j;
	memset(map,0,sizeof(map));
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			scanf("%d",&map[i][j]);
		}
	}
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)
	{
		if(map[i][j]>0)
		{
			s[k].b=i;
			s[k].e=j;
			s[k++].m=map[i][j];
		}
	}
}

void solve()
{
	int i,j;
	sort(s,s+k,cmp);
	for(i=0;i<k;i++)
	{
		if(find(s[i].b)!=find(s[i].e))
		{
			mix(s[i].b,s[i].e);
			maxx=maxn(maxx,s[i].m);
		}
	}
	printf("%d
",maxx);
}
int main()
{
	int i,j;
	while(scanf("%d",&n)!=EOF)
	{
		k=0;maxx=0;
		init();
		getmap();
		solve();
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/tonghao/p/4732572.html