还是畅通工程
- 题目描述:
-
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
- 输出:
-
对每个测试用例,在1行里输出最小的公路总长度。
- 样例输入:
-
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
- 样例输出:
-
3 5
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cctype> 6 #include <cstring> 7 8 #include <vector> 9 #include <deque> 10 #include <list> 11 #include <map> 12 #include <set> 13 #include <stack> 14 #include <queue> 15 #include <algorithm> 16 #include <string> 17 18 19 #define MAXD 99999999 20 using namespace std; 21 22 23 int g[101][101]; 24 25 26 int lowcost[101]; 27 28 int vis[101]; 29 30 31 32 33 34 int main() 35 { 36 37 38 39 int n,i,j,k; 40 41 int m; 42 43 44 45 while(scanf("%d",&n)!=EOF) 46 { 47 if(n==0) 48 break; 49 50 51 m=n*(n-1)/2; 52 53 for(i=1;i<=n;i++) 54 for(j=1;j<=n;j++) 55 g[i][j]=g[j][i]=MAXD; 56 57 58 59 60 for(i=0;i<m;i++) 61 { 62 int a,b,c; 63 64 scanf("%d%d%d",&a,&b,&c); 65 66 67 if(g[a][b]>c) 68 {g[a][b]=g[b][a]=c;} 69 70 71 } 72 73 74 int mincost=0; 75 76 77 78 79 for(i=1;i<=n;i++) 80 { 81 vis[i]=0; 82 83 84 lowcost[i]=g[1][i]; 85 } 86 87 vis[1]=1; 88 89 90 for(i=1;i<n;i++) 91 { 92 k=-1; 93 94 int temp=MAXD; 95 96 for(j=1;j<=n;j++) 97 { 98 if(vis[j]==0) 99 { 100 if(temp>lowcost[j]) 101 { 102 k=j;temp=lowcost[j]; 103 } 104 } 105 } 106 107 108 if(k==-1) 109 break; 110 111 112 vis[k]=1; 113 114 mincost+=temp; 115 116 117 for(j=1;j<=n;j++) 118 { 119 if(vis[j]==0) 120 { 121 if(lowcost[j]>g[k][j]) 122 { 123 lowcost[j]=g[k][j]; 124 } 125 } 126 } 127 } 128 cout<<mincost<<endl; 129 } 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 return 0; 165 }