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

 

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
 
初学最小生成树,不怎么会,完全是用Dijkstra算法改过来的  就当成是半个模板了0.0
 
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 
 8 #define inf 99999999
 9 
10 int map[105][105],n,sum,node[105];
11 
12 void prim()
13 {
14     int vis[105]={0};
15     int tm=1,ans;
16     node[1]=0;
17     vis[1]=1;
18     for(int k=1;k<n;k++)
19     {
20         int Min=inf;
21         for(int i=1;i<=n;i++)
22         if(!vis[i])
23         {
24             if(node[i]>map[tm][i])
25             node[i]=map[tm][i];
26             //cout<<i<<node[i]<<" ";
27             if(Min>node[i])
28             {
29                 Min=node[i];
30                 ans=i;
31             }
32         }
33         vis[ans]=1,tm=ans;
34         sum+=Min;
35         //cout<<ans<<Min<<endl;
36         //cout<<Min<<" "<<ans<<" "<<sum<<endl;
37     }
38 }
39 
40 int main()
41 {
42     while(cin>>n&&n)
43     {
44         for(int i=1;i<=n;i++)
45         node[i]=inf;
46         for(int i=0;i<n*(n-1)/2;i++)
47         {
48             int a,b,x;
49             cin>>a>>b>>x;
50             map[a][b]=map[b][a]=x;
51         }
52         sum=0;
53         prim();
54         cout<<sum<<endl;
55     }
56     return 0;
57 }

 

posted on 2014-08-20 16:47  Mis_xiao  阅读(767)  评论(0编辑  收藏  举报