- 题目描述:
-
看过变形金刚的人一定记得这样一个场景,机器人在攻击人类的时候,可以上天入地,并且都如履平地。
聪明的人类很快就想到,可不可以也利用地下的攻势来跟机器人进行周旋。很快,人类就在地下建立了几个基地。现在这些基地之间要进行合作,必须有一些基地之间是有通道的,这样无论是运输补给还是进行交流都会方便很多。在每两个基地之间都建立一个通道,这是一个好的方法,基地之间的交流会变得极其方便。但是,同时要考虑到修地下通道所花的人力、物力、以及时间。现在时间很紧迫,必须选择一些通道来进行修建。根据对地形的分析及研究,人类确定了一些适合修建的备选通道。相信聪明的你很快会想到,这些通道也不用全部都修建,只要修建一些通道,使得任意两个基地之间都互相可达就可以了。通道修好后,还有最后一项工作要做,就是在每条修好的通道之间都铺设一段铁轨,铁轨需要的费用与通道的长度相同。同时,跟现实中的铁路不同,地下的铁路每次只能买一批固定长度的钢轨,每条通道用一条钢轨,如果钢轨的长度大于通道的长度,剩下的丢弃即可。现在人类将确定的备选通道的数目,每条通道连接的两个基地名称,以及这条通道的长度告诉你。请问购买的这一批钢轨的长度最短要多长才能满足要求?
- 输入:
-
输入的第一行包括基地的个数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;elsecout<<"My God"<<endl;}return 0; }/**************************************************************Problem: 1417User: lcyvinoLanguage: C++Result: AcceptedTime:330 msMemory:3832 kb ****************************************************************/