/*
http://acm.hdu.edu.cn/showproblem.php?pid=1879
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct edge{
int a,b,c,f; //a,b 是边的两个顶点 c 是费用 f 表示是否建路
}edge;
edge tree[110*110/2];
int pa[110];
int n,m,sum;
int cmp(const void*a, const void*b)
{
return ((edge*)a)->c-((edge*)b)->c;
}
int find(int x)
{
int px=pa[x];
while(px!=x)
{
x=px;
px=pa[x];
}
return px;
}
void merge(int x, int y)
{
int px=find(x);
int py=find(y);
if(px!=py)
pa[px] = py;
}
void kruskal()
{
int i;
for(i=0; i<m; i++)
{
if(find(tree[i].a)!=find(tree[i].b))
{
merge(tree[i].a,tree[i].b);
tree[i].f=1;
sum+=tree[i].c;
}
}
}
int main()
{
freopen("input.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
m = n*(n-1)/2;
sum=0;
int i;
memset(tree,0,sizeof(tree));
for(i=1; i<=n; i++) pa[i]=i;
for(i=0; i<m; i++)
{
scanf("%d %d %d %d",&tree[i].a,&tree[i].b,&tree[i].c,&tree[i].f);
if(tree[i].f) tree[i].c=0; //预处理 使已经建路的 费用为0
}
qsort(tree,m,sizeof(tree[0]),cmp);
kruskal();
printf("%d\n",sum);
}
return 0;
}
HDU 1879 继续畅通工程

最新推荐文章于 2021-05-11 20:46:10 发布
