• 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;
    }

       
       
       

  • 相关阅读:
    Python 集合 深浅copy
    python基础(基础数据类型)
    python基础一
    Asp.net获取网站绝对路径的几种方法
    Ajax请求被缓存的几种处理方式
    说说字符编码
    linux学习记录
    mysql基础
    【Android开发入门】关于ListView中按钮监听器设置的解决方案
    线程同步小结
  • 原文地址:https://www.cnblogs.com/QQbai/p/2130735.html
Copyright © 2020-2023  润新知