#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct node
{
int i,j,v,u;
}T[10100];
int father[10100],N,M;
int cmp(node a,node b)
{
return a.v<b.v;
}
int find(int x)
{
return x==father[x]? x:x=find(father[x]);
}
void merge(int x,int y)
{
int a,b;
a=find(x),b=find(y);
if(a!=b)
father[a]=b;
}
int krusal( )
{
int a,i,b,c,sum=0;
for(i=0;i<M;i++)
{
a=T[i].i;
b=T[i].j;
c=T[i].v;
if(find(a)!=find(b))
{
sum+=c;
merge(a,b);
}
}
return sum;
}
int main( )
{
int i,j,k,a,b,c,d;
while(scanf("%d",&N)!=EOF,N)
{
for(i=1;i<=N;i++)
father[i]=i;
M=N*(N-1)/2;
for(i=0;i<M;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
T[i].i=a;
T[i].j=b;
if(d==1)
T[i].v=0;
else
T[i].v=c;
}
sort(T,T+M,cmp);
printf("%d\n",krusal());
}
return 0;
}
思路,排序,最小生成树。krusal算法。
转载于:https://www.cnblogs.com/tangcong/archive/2011/04/30/2033271.html