zoukankan      html  css  js  c++  java
  • HDU 1233 还是畅通工程

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最小的公路总长度。
     
    Sample Input
    3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
     
    Sample Output
    3 5
     
    //最小生成树 Prim算法
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <string.h>
    using namespace std;
    int
    main()
    {

        int
    p[103][103],l[103];
        int
    n,m,i,j,x,y,sum;
        while
    (scanf("%d",&n),n)
        {
       m=(n-1)*n;
            m=(m>>1);
            memset(l,0,sizeof(l));
            for
    (i=0;i<m;i++)
            {

              scanf("%d%d%d",&x,&y,&sum);
              p[x][y]=p[y][x]=sum;
            }


          sum=0;
          l[1]=1;
          x=n-1;
          while
    (x--)//这里就是我学的prim算法基本模板了!
          {
         y=9999999;
           for
    (i=2;i<=n;i++)
             {

                if
    (!l[i]&&p[1][i]<y)
                 {

                   j=i;
                   y=p[1][i];
                 }
             }

            sum+=y;
            l[j]=1;
            for
    (i=2;i<=n;i++)
              if
    (!l[i]&&p[i][j]<p[1][i])
                 p[1][i]=p[i][j];

        }

        printf("%d\n",sum);
       }

        return
    0;
    }
  • 相关阅读:
    LED事件
    CSR8670按钮事件
    编译提示:warning: ISO C89 forbids mixed declarations and code
    C#使用Smtp,通过qqmail发送邮件
    编写VS的Snippet
    WPF的Clipboard.SetText()有问题
    HttpListenerRequest.ContentEncoding
    jQuery的Deferred对象教程
    visual studio如何修改c++项目的.net framework框架版本
    如何让Sqlite支持Entity Framework Code-First
  • 原文地址:https://www.cnblogs.com/372465774y/p/2430499.html
Copyright © 2011-2022 走看看