题意:省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。(仍然是最小生成树问题)
#include"stdio.h"
#include"stdlib.h"
struct e
{
int x,y,v;
}val[10500];
int set[105],n,m,sum;
int cmp(const void *a,const void *b)
{
return ((e *)a)->v-((e *)b)->v;
}
int find(int t)
{
return t==set[t]?t:set[t]=find(set[t]);
}
void Kustra()
{
for(int i=1;i<=m;++i)
{
int a=val[i].x,b=val[i].y,v=val[i].v;
if(find(a)!=find(b))
{
set[find(a)]=b;//开始时将find(a)写成a,WA了几次我就纳闷了,原来出现了这种错误;为了避免出现这样的问题将if语句前加 a=find(a),b=find(b);这里用a;
sum+=v;
}
}
}
int main()
{
while(scanf("%d",&n),n)
{
sum=0;
m=n*(n-1)/2;
for(int i=0;i<=n;++i)
set[i]=i;
for(int i=1;i<=m;++i)
{
int p;
scanf("%d%d%d%d",&val[i].x,&val[i].y,&val[i].v,&p);
if(p)
set[find(val[i].x)]=find(val[i].y);
}
qsort(val,m,sizeof(val[1]),cmp);
Kustra( );
int c=0;
/*for(int i=1;i<=n;++i)
{
if(set[i]==i)
++c;
}*/ //这里可以不要,一样可以AC,不影响;
printf("%d\n",sum);
}
return 0;
}