多了一个表示已建立和未建立的状态。
排序时将已建立的状态排在前面就好。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 100000001
using namespace std;
int a[101];
struct lx
{
int x,y,c,v;
}l[5001];
void intset(int n)
{
for(int i=0; i<=n; i++)
a[i]=i;
}
int fa(int x)
{
if(x!=a[x])
a[x]=fa(a[x]);
return a[x];
}
bool cmpa(lx t1,lx t2)
{
if(t1.v==t2.v)
return t1.c<t2.c;
else
return t1.v>t2.v;
}
int main()
{
int n,m;
while(scanf("%d",&n),n)
{
m=n*(n-1)/2;
int v;
for(int i=0;i<m;i++)
scanf("%d%d%d%d",&l[i].x,&l[i].y,&l[i].c,&l[i].v);
int x,y;
intset(n);
sort(l,l+m,cmpa);
int ans=0;
for(int i=0;i<m;i++)
{
x=fa(l[i].x);
y=fa(l[i].y);
if(x!=y)
{
if(l[i].v==0)
ans+=l[i].c;
a[y]=x;
}
}
printf("%d\n",ans);
}
}