當N爲0時輸入結束。 Output每個測試用例的輸出佔一行,輸出全省暢通需要的最低成本。 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 0Sample Output
3 1 0
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int b[1000][1000];
int main()
{
int a[1000],mark[1000];
int m,n,i,j,x,y,z,k,min,s,p;
while(scanf("%d",&n)!=EOF)
{
if(n==0){break;}
m=n*(n-1)/2;
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
memset(mark,0,sizeof(mark));
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&x,&y,&z,&p);
if(p==1)
{
b[x][y]=-1;
b[y][x]=-1;
}
if(p==0)
{
b[x][y]=z;
b[y][x]=z;
}
}
k=1;s=1;
for(j=1;j<=n;j++)
{
mark[k]=2;min=9999999999;
for(i=1;i<=n;i++)
{
if(b[k][i]!=0&&(a[i]>b[k][i]||a[i]==0)&&mark[i]!=2)
{
a[i]=b[k][i];
mark[i]=1;
}
if(b[i][k]!=0&&(a[i]>b[i][k]||a[i]==0)&&mark[i]!=2)
{
a[i]=b[i][k];
mark[i]=1;
}
}
for(i=1;i<=n;i++)
{
if(a[i]!=0&&a[i]<min&&mark[i]==1)
{
min=a[i];
s=i;
}
}
k=s;
}
int ans=0;
for(i=1;i<=n;i++)
{
if(a[i]>0)
ans=ans+a[i];
}
printf("%d\n",ans);
}
return 0;
}