题意梗概:N(n<100)个村子想要富起来,自然就要先修路,不过到底还是没富起来,所以陷入了一个怪圈 :资金不足->修不起路->资金不足......
为了实现走向全民小康社会,全面实现三个现代化,坚持党的四项......咳咳,总之,你作为一名红领巾,需要提供一种花费最少(即路径最短),又能
让它们各个村庄,都联系起来的修路方法,帮助村民解决困难。
问题分析:可以把路径的长短看作权值大小,因此,只需用一些方法村庄图的最小生成树,将权值一一相加就可以得到答案,求最小生成树有很多种方法,
譬如说prim算法或者kruskal算法,这里村庄之间都是相互连通的(没有路0.0),属于稠密图,显然复杂度至于顶点个数有关的prim算法更为合适。
1 #include "cstdio" 2 #include "cstring" 3 int v[100][100]; 4 int flag[100]; 5 int prim(int n) 6 { 7 int mi,t=n,k,sum=0; 8 while (--t) 9 { 10 mi = 100000; 11 for (int i=2;i<=n;i++) 12 { 13 if (mi > v[1][i] && !flag[i] ) 14 { 15 mi = v[1][i]; 16 k = i; 17 } 18 } 19 sum += mi; 20 flag[k] = 1; 21 for (int i=2;i<=n;i++) 22 { 23 if (v[1][i] > v[k][i] && !flag[i]) 24 v[1][i] = v[k][i]; 25 } 26 } 27 return sum; 28 } 29 int main() 30 { 31 int n,a,b,c; 32 while (scanf ("%d",&n) && n) 33 { 34 memset(v,0,sizeof(v)); 35 for (int j=1;j<=n*(n-1)/2;j++) 36 { 37 scanf ("%d%d%d",&a,&b,&c); 38 v[a][b] = v[b][a] = c; 39 } 40 memset(flag,0,sizeof(flag)); 41 printf ("%d ",prim(n)); 42 } 43 return 0; 44 }