题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879
源代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct Edge
{
int start,end,weight,flag;
}edge;
edge e[5000];
int city[101];
bool comp(const edge &a,const edge &b)
{
if(a.weight<b.weight)return 1;
return 0;
}
int find_set(int n)
{
if(city[n]==-1)return n;
else return city[n]=find_set(city[n]);
}
bool Merge(int s1,int s2)
{
int r1=find_set(s1);
int r2=find_set(s2);
if(r1==r2)return 0;
if(r1<r2)city[r2]=r1;
else city[r1]=r2;
return 1;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int m=n*(n-1)/2;
int sum=0,count=0,i;
memset(city,-1,sizeof(city));
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&e[i].start,&e[i].end,&e[i].weight,&e[i].flag);
if(e[i].flag==1)e[i].weight=0;
}
sort(e,e+m,comp);
for(i=0;i<m;i++)
{
if(Merge(e[i].start,e[i].end))
{
count++;
sum+=e[i].weight;
}
if(count==n-1)break;
}
printf("%d\n",sum);
}
return 0;
}