Sample Input
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
Sample Output
3
1
0
#include<bits/stdc++.h>
using namespace std;
int point[110][110],flag[110];
int n,sum;
void prim()
{
int i,j,k,v,min;
flag[1]=1;
sum=0;
for(i=1;i<n;i++)
{
min=999999999;
for(j=1;j<=n;j++)
if(flag[j])
{
for(k=1;k<=n;k++)
if(!flag[k] && min>point[j][k])
{
min=point[j][k];
v=k;
}
}
flag[v]=1;
sum+=min;
}
}
int main()
{
int i,j,m,a,b,p,temp;
while(scanf("%d",&n),n)//村庄数目
{
memset(flag,0,sizeof(flag));
m=(n*(n-1))/2;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&p,&temp);//两个村庄编号,成本,修建状态
{
if(temp==1)//建好了就不要钱了
point[a][b]=point[b][a]=0;
else
point[a][b]=point[b][a]=p;
}
}
prim();//求全路畅通最低成本
printf("%d\n",sum);
}
return 0;
}