zoukankan      html  css  js  c++  java
  • HDOJ 1863 畅通工程

    prim。。。。。

    畅通工程

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 12261    Accepted Submission(s): 5005


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
     

    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 
    行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
     

    Output
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
     

    Sample Input
    3 3
    1 2 1
    1 3 2
    2 3 4
    1 3
    2 3 2
    0 100
     

    Sample Output
    3
    ?
     

    Source
     

    Recommend
    lcy
     


    #include <iostream>
    #include <cstdio>
    #include <cstring>

    using namespace std;

    const int INF=0x3f3f3f3f;
    const int MAXN=1111;
    int c[111][111];
    int n,m;

    int prim()
    {
        int lowcast[MAXN];
        bool s[MAXN];

        for(int i=1;i<=n;i++)
        {
            lowcast=c[1];
            s=0;
        }
        s[1]=1;
        int sum=0;

        for(int i=2;i<=n;i++)
        {
            int min=INF;
            int u=-1;
            for(int j=1;j<=n;j++)
            {
                if(!s[j]&&lowcast[j]<min)
                {
                    u=j;
                    min=lowcast[j];
                }
            }
            if(u==-1) return INF;
            sum+=min;
            s=1;
            for(int j=1;j<=n;j++)
            {
                if(!s[j]&&lowcast[j]>c[j])
                {
                    lowcast[j]=c[j];
                }
            }
        }

        return sum;
    }

    int main()
    {
    while(scanf("%d%d",&m,&n)!=EOF&&m)
    {
        int a,b,cd;

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                  c[j]=0;
                else
                  c[j]=INF;
            }
        }

        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&cd);
            if(c[a]>cd)
              c[a]=c[a]=cd;
        }

        int ans=prim();

        if(ans>=INF)
        {
            printf("? ");
        }
        else
        {
            printf("%d ",ans);
        }

    }
        return 0;
    }

  • 相关阅读:
    Windows快捷方式的形式关机方法
    [Andriod官方训练教程]创建你的第一个App之创建一个简单的用户界面
    使用GDAL对HDF数据进行geoloc校正
    破解sqlyog 30天试用限制
    [Andriod官方训练教程]创建你的第一个App之运行你的App
    [Andriod官方训练教程]创建你的第一个App之开始另一个Activity
    GDAL对空间数据的管理
    win linux 下 部署war包到Tomcat根目录
    Spring session
    使用GDAL对HDF数据进行校正
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350957.html
Copyright © 2011-2022 走看看