1233 还是畅通工程

本题求的是最小生成树,Kustra(或prim)算法。快排时用qsort,不用冒泡(可能会超时);

题意:使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

Kustra算法求解:

#include"stdio.h"
#include"stdlib.h"
int set[105],n,m,sum;
struct  e
{
    int x,y,v;     
}val[10000];
int cmp(const void *a,const void *b)
{
     return ((e *)a)->v-((e *)b)->v;    
}
int find(int x)
{
   return x==set[x]?set[x]:find(set[x]);   
}
void Kustra()
{
    for(int i=0;i<m;++i)
    {
       int a=val[i].x,b=val[i].y,v=val[i].v;
       if(find(a)!=find(b))
       {
         sum+=v;
         set[find(a)]=find(b);    
       }
    }
}
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=0;i<m;++i)
             scanf("%d%d%d",&val[i].x,&val[i].y,&val[i].v);
         qsort(val,m,sizeof(val[0]),cmp);
         Kustra();
         printf("%d\n",sum);       
     }
     return 0;
}

prim算法求解:

#include"stdio.h"
#define  dingtype int
#define   MAXX  999999
#define  leng  101
dingtype  map[leng][leng];
dingtype  dis[leng];
int prim(int n)
{
    int min;
    int i,j;
    int c=1;
    int sum=0;
    dis[c]=0;
    for(i=1;i<=n;i++)
    {
      if(map[i][c]!=0)
      {
          dis[i]=map[i][c];
      }   
    }
    for(i=2;i<=n;i++)
    {
       min=MAXX;
       for(j=1;j<=n;j++)
       {
          if(dis[j]<min&&dis[j]!=0)
          {
             min=dis[j];
             c=j;
          }              
       }          
         dis[c]=0;      
         sum+=min;
         for(int j=1;j<=n;j++)
         {
            if(map[j][c]!=0&&(map[j][c]<dis[j])&&dis[j]!=0)
            {
                  dis[j]=map[j][c];
            }    
         }
    }
    return  sum;
}
int main()
{
    int n;
    int i,d,x,y,sum;
    while(scanf("%d",&n),n)
    {
           for(i=1;i<=n*(n-1)/2;i++)
           {
                scanf("%d%d%d",&x,&y,&d);
                map[x][y]=map[y][x]=d;                   
           }
           for(i=1;i<=n;i++)
           {
               map[i][i]=0;            
           }              
               sum=prim(n);
              printf("%d\n",sum);
                         
    }
    return  0;
}

   
   
   

posted @ 2011-08-08 11:28  bcy  阅读(161)  评论(0编辑  收藏  举报