HDU(1087)继续畅通工程
这题还是最小生成树 ==已经修建的道路的权值位0,然后再用克鲁斯卡尔算法
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=2000; int p[maxn]; struct node { int u,v,w; }; bool cmp(node a,node b) { return a.w<b.w; } int find(int x) { return p[x]==x? x : find(p[x]); } node a[maxn*maxn]; int main() { int n,m; while(scanf("%d",&n)!=EOF&&n) { for(int i=0;i<=n;i++) p[i]=i; m=n*(n-1)/2; int t; for(int i=0;i<m;i++) { scanf("%d%d%d%d",&a[i].u,&a[i].v,&a[i].w,&t); if(t) a[i].w=0; } sort(a,a+m,cmp); int ans=0; for(int i=0;i<m;i++) { int fx=find(a[i].u); int fy=find(a[i].v); if(fx!=fy) { ans+=a[i].w; p[fx]=fy; } } printf("%d\n",ans); } return 0; }