这个题的路分为已修和未修,因此只需将已修的路的费用改为0,就转化成了一般的最小生成树的题了
#include<cstdio>
#include<algorithm>
using namespace std;
int f[105],n,m;
struct stu
{
int a,b,c;
}t[5500];
int cmp(struct stu x,struct stu y)
{
return x.c<y.c;
}
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
int krus()
{
int i,k=0,s=0,x,y;
for(i=1;i<=m;i++){
x=find(t[i].a);
y=find(t[i].b);
if(x!=y){
s+=t[i].c;
k++;
if(k==n-1)
break;
f[x]=y;
}
}
return s;
}
int main()
{
int i,s,z;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
m=n*(n-1)/2;
for(i=1;i<=m;i++){
scanf("%d%d%d%d",&t[i].a,&t[i].b,&t[i].c,&z);
if(z==1) //将已修的路的费用变为0
t[i].c=0;
}
for(i=1;i<=n;i++)
f[i]=i;
sort(t+1,t+1+m,cmp);
s=krus();
printf("%d\n",s);
}
return 0;
}