还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26566 Accepted Submission(s): 11852
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当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 5Huge input, scanf is recommended.HintHint裸的最小生成树:不过还是留下了血的教训,一开始我这样初始化: for(int i=0;i<t;i++){
if(i<=n) arr[i]=i;
cin>>node[i].i>>node[i].j>>node[i].d;
}没有考虑到当n=2的时候(n-1)*n/2<n ; 所以一直哇得不知所措,幸亏狗哥出手相助#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int n,t,arr[105],ans; int sum; struct Node{ int i,j; int d; }; Node node[5050]; bool cmp(const Node &a,const Node &b){ return a.d<b.d; } int _find(int x){return x==arr[x] ? x:arr[x]=_find(arr[x]); } int _unior(int x,int y){ int xx=_find(x); int yy=_find(y); if(xx!=yy){ arr[xx]=yy;ans++; return 1;} else return 0; } void test(){ for(int i=0;i<t;i++){ if(_unior(node[i].i,node[i].j)){ sum+=node[i].d; } if(ans==n-1) break; } } int main(void){ while(cin>>n&&n){ ans=0; sum=0; t=n*(n-1)/2; for(int i=0;i<=n;i++) arr[i]=i; for(int i=0;i<t;i++){ cin>>node[i].i>>node[i].j>>node[i].d; } sort(node,node+t,cmp); test(); cout<<sum<<endl; } }