http://acm.hdu.edu.cn/showproblem.php?pid=1879
题目 | 题意 | 备注 |
给出道路修没修,修的代价,求最少花费,要连通图 | 并查集+二级排序 | java冒泡排的超时(c++用结构体过了) |
#include<stdio.h>
#include<stdlib.h>
struct date
{
int a,b,c,d;
}s[5060];
int f[101];
int cmp(const void *a,const void *b)
{
struct date *c=(date *)a;
struct date *d=(date *)b;
if(c->d!=d->d)return d->d - c->d;
else return c->c - d->c;
}
int main()
{
int m,n,i;
while(scanf("%d",&n))
{
if(n==0){break;}
m=n*(n-1)/2;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
}
qsort(s,m,sizeof(s[0]),cmp);
for(i=1;i<=n;i++)
{
f[i]=i;
}
int fa,fb,min=0,p=0;
for(i=0;i<m;i++)
{
fa=s[i].a;
fb=s[i].b;
while(fa!=f[fa])fa=f[fa];
while(fb!=f[fb])fb=f[fb];
if(fa!=fb)
{
f[fa]=f[fb];
if(s[i].d==0)
{
min=min+s[i].c;
}
p++;
if(p==n-1)break;
}
}
printf("%d\n",min);
}
}