首页 > 代码库 > 还是畅通工程

还是畅通工程

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

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

3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output

3
5
这算法叫啥玩意儿我忘记了  但是是最小生成树的题
技术分享
 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cmath>
12 #include<cstring>
13 #include <cstdio>
14 #include <cstdlib>
15 #include<cstring>
16 int a[110][110];
17 int b[110];
18 int sum;
19 int t;
20 void TM()
21 {
22     int min1=1e13;
23     int temp=0;
24     for(int i=1;i<=t;i++)
25     {
26         if(b[i]==1)
27         {
28             for(int j=1;j<=t;j++)
29             {
30                 if(b[j]==1)
31                     continue;
32                 if(a[i][j]<min1)
33                 {
34                     min1=a[i][j];
35                     temp=j;
36                 }
37             }
38         }
39     }
40     if(temp==0)
41         return;
42     sum+=min1;
43     b[temp]=1;
44 }
45 int main()
46 {
47 
48     int temp;
49     while(cin>>t)
50     {
51         if(t==0)
52             break;
53         temp=t*(t-1)/2;
54         int i,j;
55         memset(a,0,sizeof(a));
56         while(temp--)
57             {
58                 cin>>i>>j;
59                 cin>>a[i][j];
60                 a[j][i]=a[i][j];
61             }
62         memset(b,0,sizeof(b));
63         b[1]=1;
64         sum=0;
65         int min1=a[1][2];
66         temp=2;
67         for(int i=3;i<=t;i++)
68         {
69             if(min1>a[1][i])
70             {
71                 temp=i;
72                 min1=a[1][i];
73             }
74         }
75         b[temp]=1;
76         sum+=min1;
77         for(int i=1;i<=t;i++)
78         {
79             TM();
80         }
81         cout<<sum<<endl;
82     }
83     return 0;
84 }
View Code

 

还是畅通工程