Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当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 }