A
来源:互联网 发布:怎么改淘宝的支付宝 编辑:程序博客网 时间:2024/06/06 04:15
A - 还是畅通工程
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
当N为0时,输入结束,该用例不被处理。
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
35 Huge input, scanf is recommended.
Hint
加权值
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int MAX=1e6+10;int father[MAX];void init (int n){ for(int i = 0 ; i <= n ; i ++) { father[i] = i; }}int find (int x){ if(x != father[x]) { return father[x] = find( father [x]); }return x;}void unite(int a,int b){ int fa = find (a); int fb = find (b); int tmp = father[fa] + father[fb]; if(father[fa] > father[fb]) { father[fa] = fb; tmp = father[fb]; } else { father[fb] = fa; tmp = father[fa]; }}struct node{int u;int v;int cost;}p[MAX];bool cmp (node a,node b){ return a.cost < b.cost;}int main(){int n,m;while(~scanf("%d",&n)&&n){ init(n); m = n*(n-1)/2; for(int i = 0 ; i < m; i++) { scanf("%d %d %d",&p[i].u,&p[i].v,&p[i].cost); }sort ( p , p+m, cmp); int sum = 0,num = 0;for(int i =0 ; i < m ; i ++) if( find(p[i].u) != find(p[i].v)) { sum += p[i].cost; num++; unite (p[i].u , p[i].v); if(num == n-1) break; } printf("%d\n",sum);}return 0;}