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 }

 

 

posted @ 2013-08-09 13:35  小の泽  阅读(158)  评论(0编辑  收藏  举报