• ACM DS 畅通工程


    畅通工程
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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 ?
     
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int father[102];
    struct node
    {
        int a,b,value;
    } w[5002];
    
    bool cmp(const node &a,const node &b)
    {
        return a.value<b.value;
    }
    
    int find(int x)
    {
        if(x!=father[x])
            father[x]=find(father[x]);
        return father[x];
    }
    void merge(int x,int y,int z,int &tp)
    {
        int a,b;
        a=find(x);
        b=find(y);
        if(a!=b)
        {
            tp+=z;
            father[a]=b;
        }
    }
    
    int main()
    {
        int n,m,sum;
        while(scanf("%d%d",&m,&n)&&m)
        {
            sum=0;
    
            for(int i=1; i<=m; i++)
                scanf("%d %d %d",&w[i].a,&w[i].b,&w[i].value);
            sort(w+1,w+m+1,cmp);//按边长从小到大排序
            for(int i=1; i<=n; i++)
                father[i]=i;
            for (int i=1; i<=m; i++)
            {
                merge(w[i].a,w[i].b,w[i].value,sum);
            }
    
    
            int mother[102];
            for(int i=1; i<=n; i++)
            {
                mother[i] = find(i);
            }
    
            bool ok = 1;
            for(int i = 1; i<n; i++)
            {
                if(mother[i]!=mother[i+1])
                {
                    ok=0;
                    break;
                }
    
            }
            if(ok)
                printf("%d
    ",sum);
            else
                puts("?");
        }
    }
    

      

     
  • 相关阅读:
    Linux
    《移动群智感知网络》阅读笔记
    JAVA小记
    数据结构第十章:内部排序
    数据结构第九章:查找
    Oracle 物化视图(materialized view)
    Oracle Function 开启事务以及Update返回更新成功条数
    oracle存储过程的update并获取结果记录
    单例模式实现Demo
    winform BackgroundWorker组件操作
  • 原文地址:https://www.cnblogs.com/wejex/p/3257798.html
Copyright © 2020-2023  润新知