还是畅通工程
Posted 小小超plus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还是畅通工程相关的知识,希望对你有一定的参考价值。
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
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 }
以上是关于还是畅通工程的主要内容,如果未能解决你的问题,请参考以下文章