HDU_1879
如果道路已建,就直接应用并查集,如果未建,就把边储存起来。最后再应用一次Kruskal算法求最小生成树即可。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int p[110],u[10010],v[10010],w[10010],r[10010];
int find(int x)
{
return p[x]==x?x:(p[x]=find(p[x]));
}
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return w[*p]-w[*q];
}
int main()
{
int i,j,k,N,n,ans,num;
while(1)
{
scanf("%d",&N);
if(N==0)
break;
j=(N-1)*N/2;
for(i=1;i<=N;i++)
p[i]=i;
n=0;
for(i=0;i<j;i++)
{
scanf("%d%d%d%d",&u[n],&v[n],&w[n],&k);
if(k)
{
if(find(u[n])!=find(v[n]))
p[find(u[n])]=find(v[n]);
}
else
n++;
}
for(i=0;i<n;i++)
r[i]=i;
qsort(r,n,sizeof(r[0]),cmp);
ans=0;
for(i=0;i<n;i++)
{
num=r[i];
if(find(u[num])!=find(v[num]))
{
p[find(u[num])]=find(v[num]);
ans+=w[num];
}
}
printf("%d\n",ans);
}
return 0;
}