zoukankan      html  css  js  c++  java
  • 题目1417:变形金刚

    题目描述:

    看过变形金刚的人一定记得这样一个场景,机器人在攻击人类的时候,可以上天入地,并且都如履平地。

    聪明的人类很快就想到,可不可以也利用地下的攻势来跟机器人进行周旋。很快,人类就在地下建立了几个基地。现在这些基地之间要进行合作,必须有一些基地之间是有通道的,这样无论是运输补给还是进行交流都会方便很多。在每两个基地之间都建立一个通道,这是一个好的方法,基地之间的交流会变得极其方便。但是,同时要考虑到修地下通道所花的人力、物力、以及时间。现在时间很紧迫,必须选择一些通道来进行修建。根据对地形的分析及研究,人类确定了一些适合修建的备选通道。相信聪明的你很快会想到,这些通道也不用全部都修建,只要修建一些通道,使得任意两个基地之间都互相可达就可以了。通道修好后,还有最后一项工作要做,就是在每条修好的通道之间都铺设一段铁轨,铁轨需要的费用与通道的长度相同。同时,跟现实中的铁路不同,地下的铁路每次只能买一批固定长度的钢轨,每条通道用一条钢轨,如果钢轨的长度大于通道的长度,剩下的丢弃即可。现在人类将确定的备选通道的数目,每条通道连接的两个基地名称,以及这条通道的长度告诉你。请问购买的这一批钢轨的长度最短要多长才能满足要求?

    输入:

    输入的第一行包括基地的个数n(1<=n<=100),以及备选通道的个数m(1<=m<=10000)。

    接下来的m行,每行代表一个备选通道,其中包括两个字符串base1及base2,代表两个基地的名称(字符串的长度1<=len<=100),以及一个整数w(1<=w<=10000000),代表这两个基地之间的距离。 

    输出:

    输出购买的这一批钢轨的长度最短需要的长度。如果题目中给出的备选通道,不论你怎么选择,都不能使任意两个基地之间可以互相可达,那么请输出 “My God” 即可。

    样例输入:
    5 8
    a b 2
    a c 3
    b d 4
    a d 2
    b c 1
    d e 3
    a e 2
    c e 5
    5 5
    a c 3
    a d 2
    d e 3
    a e 2
    c e 5
    
    样例输出:
    2
    My God
    
    提示:

    1.由于修建方案的不同,数据中给出的两个基地之间的距离可能有多个,取最短的那个即可。




    --------------------------------------------------------------------------------------------------------------------------

    思想:因为输入的是字符串,所以应该把字符串与Tree数组下标结合起来,所以使用map恰到好处。把基地的“名称”从字符串装换为整型变得好处理后,问题就很常规了。


    Code:
    #include <iostream>
    #include <algorithm>
    #include <map>
     
    using namespace std;
     
    struct Station{
        string base1;
        string base2;
        int int_base1;
        int int_base2;
        int cost;
    };
     
    map<string,int> baseTransfer;
    Station base[10010];
    int Tree[110];
     
    void initTree(int length){
        for(int i=0;i<=length;++i)
            Tree[i]=-1;
    }
     
    int find_Root(int x){
        if(Tree[x]==-1)
            return x;
        else{
            int tmp=find_Root(Tree[x]);
            Tree[x]=tmp;
            return tmp;
        }
    }
     
    bool cmp(Station a,Station b){
        return a.cost<=b.cost;
    }
     
    int main()
    {
       int n,m,index;
       while(cin>>n>>m){
            baseTransfer.clear();
            index=1;
            for(int i=0;i<m;++i){
                cin>>base[i].base1>>base[i].base2>>base[i].cost;
                if(baseTransfer.find(base[i].base1)==baseTransfer.end())
                    baseTransfer.insert(make_pair(base[i].base1,index++));
                if(baseTransfer.find(base[i].base2)==baseTransfer.end())
                    baseTransfer.insert(make_pair(base[i].base2,index++));
            }
            for(int i=0;i<m;++i){
                base[i].int_base1=baseTransfer[base[i].base1];
                base[i].int_base2=baseTransfer[base[i].base2];
            }
            if(baseTransfer.size()<(unsigned int)n){
                cout<<"My God"<<endl;
                continue;
            }
            initTree(n);
            sort(base,base+m,cmp);
            int maxlength=0;
            for(int i=0;i<m;++i){
                int root_a=find_Root(base[i].int_base1);
                int root_b=find_Root(base[i].int_base2);
                if(root_a!=root_b){
                    Tree[root_a]=root_b;
                    if(base[i].cost>maxlength)
                        maxlength=base[i].cost;
                }
            }
            int cnt=0;
            for(int i=1;i<=n;++i)
                if(Tree[i]==-1)
                    ++cnt;
            if(cnt==1)
                cout<<maxlength<<endl;
            else
                cout<<"My God"<<endl;
       }
       return 0;
    }
     
    /**************************************************************
        Problem: 1417
        User: lcyvino
        Language: C++
        Result: Accepted
        Time:330 ms
        Memory:3832 kb
    ****************************************************************/


     
  • 相关阅读:
    MDX Step by Step 读书笔记(六) Building Complex Sets (复杂集合的处理) Filtering Sets
    在 Visual Studio 2012 开发 SSIS,SSAS,SSRS BI 项目
    微软BI 之SSIS 系列 在 SSIS 中读取 SharePoint List
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式) Infinite Recursion 和 SOLVE_ORDER 原理解析
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式)
    使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
    MDX Step by Step 读书笔记(四) Working with Sets (使用集合) Limiting Set and AutoExists
    SQL Server 2012 Analysis Services Tabular Model 读书笔记
    Microsoft SQL Server 2008 MDX Step by Step 学习笔记连载目录
    2011新的开始,介绍一下AgileEAS.NET平台在新的一年中的发展方向
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4216441.html
Copyright © 2011-2022 走看看