标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 27493 | Accepted: 12554 |
Description
Input
Output
Sample Input
Sample Output
1
3
0 990 692
990 0 179
692 179 0
692
Hint
Source
题目大意:要想连接所有城市并建造高速公路,使得花费最小的情况下,输出消耗最大的那条高速公路需要的花费。
思路:克鲁斯卡尔贪心求最大边,代码实现很简单。
AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct path
{
int x,y,w;
}a[500*500+50];
int f[5000];
int cmp(path a,path b)
{
return a.w<b.w;
}
int find(int a)
{
int r=a;
while(f[r]!=r)
r=f[r];
int i=a;
int j;
while(i!=r)
{
j=f[i];
f[i]=r;
i=j;
}
return r;
}
void merge(int a,int b)
{
int A,B;
A=find(a);
B=find(b);
if(A!=B)
f[B]=A;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
int cont=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
f[i]=i;
for(int j=0;j<n;j++)
{
int k;
scanf("%d",&k);
a[cont].x=i;
a[cont].y=j;
a[cont++].w=k;
}
}
int output;
int tmp=0;
sort(a,a+cont,cmp);
for(int i=0;i<cont;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
merge(a[i].x,a[i].y);
tmp++;
if(tmp==n-1)//如果是最后一条入边,那么这条边一定是权值最大边
{
output=a[i].w;
}
}
}
printf("%d\n",output);
}
}
标签:
原文地址:http://blog.csdn.net/mengxiang000000/article/details/51344852