hdu1879 继续畅通工程

题意:省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。(仍然是最小生成树问题)

#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;
}
posted @ 2011-08-08 16:26  bcy  阅读(167)  评论(0)    收藏  举报