嘎唔!~又一次POJ过了HDU错了。。。不禁让我想起前两天的的Is it a tree? orz。。这次竟然错在HDU一定要是多组数据输入输出!(无力吐槽TT)。。题目很简单,炒鸡水!
题意:
告诉你每个村庄之间的距离,和几组已经联通的村庄,求使所有村庄联通所要建的道路的最短距离。
很简单,用最小生成树的Prim算法,相当于邻接矩阵已知,把已联通的村庄之间的距离改为零即可。
附上AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define infinity 1000001 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 int G[101][101]; 9 int lowcost[101]; 10 int used[101]; 11 int prim(int vcount) 12 { 13 int sum=0; 14 int i,j,k; 15 int min; 16 for (i=0; i<vcount; i++) 17 { 18 lowcost[i]=G[0][i]; 19 used[i]=0; 20 } 21 used[0]=1; 22 for (i=1; i<=vcount-1; i++) 23 { 24 j=0; 25 min = infinity; 26 for (k=1; k<vcount; k++) 27 if ((!used[k])&&(lowcost[k]<min)) 28 { 29 min = lowcost[k]; 30 j=k; 31 } 32 used[j]=1; 33 sum+=min; 34 for (k=1; k<vcount; k++) 35 if (!used[k]&&(G[j][k]<lowcost[k])) 36 { 37 lowcost[k]=G[j][k]; 38 } 39 } 40 return sum; 41 } 42 int main() 43 { 44 int i,j; 45 int sum,n,q,a,b; 46 while(scanf("%d",&n)!=EOF) 47 { 48 for(i=0; i<n; i++) 49 { 50 for(j=0; j<n; j++) 51 { 52 scanf("%d",&G[i][j]); 53 } 54 } 55 scanf("%d",&q); 56 for(i=0; i<q; i++) 57 { 58 scanf("%d%d",&a,&b); 59 G[a-1][b-1]=G[b-1][a-1]=0; 60 } 61 sum=prim(n); 62 printf("%d\n",sum); 63 } 64 return 0; 65 }
————Anonymous.PJQ
POJ2421 & HDU1102 Constructing Roads(最小生成树),布布扣,bubuko.com
POJ2421 & HDU1102 Constructing Roads(最小生成树)
原文地址:http://www.cnblogs.com/PJQOOO/p/3857219.html