省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
当N为0时输入结束。
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0#include<stdio.h> #include<cmath> #include<algorithm> using namespace std; struct data { int x,y; int len; } a[10003]; int pre[10003]; int cmp(data a,data b) { return a.len<b.len; } void init() { for(int i=1; i<=100; i++) pre[i]=i; } int Find(int x) { if(pre[x]!=x) return pre[x]=Find(pre[x]); return x; } void Merge(int x,int y) { int X=Find(x); int Y=Find(y); if(X!=Y) pre[X]=Y; } int main() { int n; while(scanf("%d",&n),n) { int m=(n*(n-1))/2; int cnt=0; init(); for(int i=0;i<m;i++) { int x,y,l,f; scanf("%d%d%d%d",&x,&y,&l,&f); if(f) Merge(x,y); else a[cnt].x=x,a[cnt].y=y,a[cnt].len=l,++cnt; } sort(a,a+cnt,cmp); int res=0; for(int i=0;i<cnt;i++) { if(Find(a[i].x)!=Find(a[i].y)) { Merge(a[i].x,a[i].y); res+=a[i].len; } } printf("%d\n",res); } }
3 1 0