某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
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 0Sample Output
3 5 Huge input, scanf is recommended.Hint
Hint #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<map> #include<algorithm> #include<iomanip> #include<queue> #include<set> #include<stack> #define inf 0x3f3f3f3f using namespace std; int n,jg; int s[105][105]; int vis[105]; void Prim() { jg=0; memset(vis,0,sizeof (vis)); int t=1; vis[1]=1; for(int h=1;h<n;h++) { int temp=inf,k; for(int i=2;i<=n;i++) if(!vis[i]&&s[t][i]<temp) { temp=s[t][i]; k=i; } vis[k]=1; jg+=temp; for(int i=2;i<=n;i++) if(!vis[i]&&s[t][i]>s[k][i]) s[t][i]=s[k][i]; } } int main() { while(scanf("%d",&n)&&n!=0) { // for(int i=1;i<=n;i++) // for(int j=1;j<=n*(n-1)/2;j++) // s[i][j]=inf; for(int i=1; i<=n*(n-1)/2; i++) { int a,b,jl; scanf("%d%d%d",&a,&b,&jl); s[a][b]=jl; s[b][a]=jl; } Prim(); cout<<jg<<endl; } return 0; }