题目地址:http://jobdu.sinaapp.com/problem.php?cid=1040&pid=74
C语言源码:
#include<stdio.h>
#include<stdlib.h>
typedef struct road
{
int a,b,len;
}road;
road r[10000];
int T[101];
int findroot(int x)
{
int temp;
if(T[x]==-1)
return x;
else
{
temp=findroot(T[x]);
T[x]=temp;
return temp;
}
}
int cmp(const void *a,const void *b)
{
road *aa=(road *)a;
road *bb=(road *)b;
return aa->len-bb->len;
}
int main()
{
int n,m,a,b,l,state,roota,rootb,top,i;
scanf("%d",&n);
while(n)
{
m=n*(n-1)/2;
top=0;
for(i=0;i<n;i++)
T[i]=-1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d %d",&a,&b,&l,&state);
a--;
b--;
if(state==1)
{
roota=findroot(a);
rootb=findroot(b);
if(roota!=rootb)
T[rootb]=roota;
}
else
{
r[top].a=a;
r[top].b=b;
r[top].len=l;
top++;
}
}
qsort(r,top,sizeof(r[0]),cmp);
l=0;
for(i=0;i<top;i++)
{
roota=findroot(r[i].a);
rootb=findroot(r[i].b);
if(roota!=rootb)
{
l+=r[i].len;
T[rootb]=roota;
}
}
printf("%d\n",l);
scanf("%d",&n);
}
}