您的位置:首页 > 其它

HDU 1879 继续畅通工程

2014-09-01 11:43 274 查看
最小生成树Kruskal

原理参见上篇

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

const int maxn=105;

int x[maxn],y[maxn];
int v[maxn*maxn],u[maxn*maxn],w[maxn*maxn];
int fa[maxn];
int r[maxn*maxn];

bool cmp (int x,int y){
return w[x]<w[y];
}

int find (int x){
if (fa[x]==x)
return x;
return fa[x]=find (fa[x]);
}

int main (){
int t;
//scanf ("%d",&t);
int n;
while (~scanf ("%d",&n)&&n){
int m=n*(n-1)/2;
for (int i=0;i<m;i++){
int a,b;
scanf ("%d%d%d%d",&v[i],&u[i],&a,&b);
if (b)
w[i]=0;
else w[i]=a;
}
for (int i=1;i<=n;i++)
fa[i]=i;
for (int i=0;i<m;i++)
r[i]=i;
int temp=0;
sort (r,r+m,cmp);
long long ans=0;
for (int i=0;i<m;i++){
int fv=find(v[r[i]]);
int fu=find(u[r[i]]);
if (fv!=fu){
ans+=w[r[i]];
temp++;
fa[fv]=fu;
}//cout<<w[r[i]]<<" ";
}
//if (temp==n-1)
printf ("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: