poj 2485 Highways
题目:
http://poj.org/problem?id=2485
因为让你求最长边,所以首先想到的是Kruskal算法(他加入生成树的最后一条边是最大边),注意n个城市有n-1条边!!!
源代码:
1 #include <iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 typedef struct 6 { 7 int from,to,c; 8 } road; 9 road r[250010]; 10 int fa[510]; 11 int count; 12 13 int cmp(const void *a,const void *b) 14 { 15 return (((road *)a)->c > ((road *)b)->c)?1:-1; 16 } 17 18 int find(int a ) 19 { 20 return fa[a]==a?a:fa[a]=find(fa[a]); 21 } 22 23 int main() 24 { 25 int cas,ans,n,i,j; 26 scanf("%d",&cas); 27 while(cas--) 28 { 29 scanf("%d",&n); 30 int sum=0; 31 for(i=0; i<n; i++) 32 { 33 int temp_1,temp_2; 34 scanf("%d",&temp_1); 35 fa[i]=i; 36 r[sum].from=r[sum].to=i; 37 r[sum++].c=temp_1; 38 for(j=1; j<n; j++) 39 { 40 scanf("%d",&temp_2); 41 r[sum].from=i; 42 r[sum].to=j; 43 r[sum++].c=temp_2; 44 } 45 } 46 qsort(r,sum,sizeof(road),cmp); 47 for(i=0; i<sum; i++) 48 { 49 int fa1=find(r[i].from); 50 int fa2=find(r[i].to); 51 if(fa1!=fa2) 52 { 53 fa[fa2]=fa1; 54 n--; 55 if(n==1) 56 { 57 ans=r[i].c; 58 break; 59 } 60 } 61 } 62 printf("%d\n",ans); 63 } 64 return 0; 65 }