畅通工程 HDU - 1233
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
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 Huge input, scanf is recommended
书上的模板。。。,正在理解ing
1 #include<cstdio> 2 #include<string> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 static const int MAX=105; 7 static const int INFTY=(1<<21); 8 static const int WHITE=0; 9 static const int GRAY=1; 10 static const int BLACK=2; 11 12 int n,M[MAX][MAX]; 13 int prim() 14 { int u,minv; 15 int d[MAX],color[MAX],p[MAX]; 16 for(int i=1;i<=n;i++) 17 { d[i]=INFTY; 18 color[i]=WHITE; 19 p[i]=-1; 20 } 21 d[1]=0; 22 while(1) 23 { minv=INFTY; 24 u=-1; 25 for(int i=1;i<=n;i++) 26 { if(minv>d[i]&&color[i]!=BLACK) 27 { u=i; 28 minv=d[i]; 29 } 30 } 31 if(u==-1) break; 32 color[u]=BLACK; 33 for(int v=1;v<=n;v++) 34 { if(color[v]!=BLACK&&M[u][v]!=INFTY) 35 { if(d[v]>M[u][v]) 36 { d[v]=M[u][v]; 37 p[v]=u; 38 color[v]=GRAY; 39 } 40 } 41 } 42 } 43 int sum=0; 44 for(int i=1;i<=n;i++) 45 { if(p[i]!=-1) sum+=M[i][p[i]]; 46 } 47 return sum; 48 } 49 void init() 50 { int i,j; 51 for(i=1;i<=n;i++) 52 { for(j=1;j<=n;j++) 53 { M[i][j]=INFTY; 54 } 55 } 56 57 } 58 int main() 59 { while(scanf("%d",&n),n!=0) 60 { init(); 61 int x,y,v; 62 for(int j=0;j<(n*(n-1))/2;j++) 63 { scanf("%d%d%d",&x,&y,&v); 64 if(v<M[x][y]) M[x][y]=M[y][x]=v; 65 } 66 printf("%d\n",prim()); 67 } 68 }