某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。

对每个测试用例,在1行里输出最小的公路总长度。

Kruskal(从边的角度求最小生成树,更适合于求边稀疏的图的最小生成树)

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<queue>
 6 #include<string.h>
 7 typedef long long ll;
 8 using namespace std;
 9 int c[1111],cc[1111],n,m;
10 struct $
11 {
12     int a,b,c;
13 }q[11111];
14 int ccc(int x)
15 {
16     return x==c[x]?x:ccc(c[x]);
17 }
18 void smy(int a,int b)
19 {
20         c[ccc(c[a])]=ccc(c[b]);
21 }
22 bool qq($ x,$ y)
23 {
24     return x.c<y.c;
25 }
26 int main()
27 {
28     while(~scanf("%d",&n)&&n)
29     {
30         m=n*(n-1)/2;
31         int s=0;
32         for(int i=1;i<=m;i++)
33             scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c);
34         for(int i=1;i<=n;i++)
35             c[i]=i;
36         sort(q+1,q+1+m,qq);
37         for(int i=1;i<=m;i++)
38         {
39             if(ccc(q[i].a)!=ccc(q[i].b))
40             {
41                 s+=q[i].c;
42                 smy(q[i].a,q[i].b);
43             }
44         }
45         printf("%d\n",s);
46     }
47     return 0;
48 }