洛谷 2256 一中校运会之百米跑

       洛谷 2256  一中校运会之百米跑

题目背景

在一大堆秀恩爱的**之中,来不及秀恩爱的苏大学神踏着坚定(?)的步伐走向了100米跑的起点。这时苏大学神发现,百米赛跑的参赛同学实在是太多了,连体育老师也忙不过来。这时体育老师发现了身为体育委员的苏大学神,便来找他帮忙。可是苏大学神需要热身,不然跑到一半就会抽(筋)、于是他就找到了你。。。如果你帮助体育老师解决了问题,老师就会给你5个积分。

题目描述

假设一共有N(2<=N<=20000)个参赛选手。(尼玛全校学生都没这么多吧)

老师会告诉你这N个选手的名字。

接着会告诉你M(1<=M<=1000000)句话,即告诉你学生A与学生B在同一个组里。

如果学生A与学生B在同一组里,学生B与学生C也在同一组里,就说明学生A与学生C在同一组。

然后老师会问你K(1<=K<=1000000)句话,即学生X和学生Y是否在同一组里。

若是则输出"Yes.",否则输出"No."

输入输出格式

输入格式:

第一行输入N和M。

接下来N行输入每一个同学的名字。

再往下M行每行输入两个名字,且保证这两个名字都在上面的N行中出现过,表示这两个参赛选手在同一个组里。

再来输入K。

接下来输入K个体育老师的询问。 

输出格式:

对于每一个体育老师的询问,输出"Yes."或"No."。

输入输出样例

输入样例:
10 6
Jack
Mike
ASDA
Michel
brabrabra
HeHe
HeHE
papapa
HeY
Obama
Jack Obama
HeHe HeHE
brabrabra HeHe
Obama ASDA
papapa Obama
Obama HeHE
3
Mike Obama
HeHE Jack
papapa brabrabra
输出样例: 
No.
Yes.
Yes.
题解:
并查集?,不过是用map储存而已。
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<map>
 5 using namespace std;
 6 map<string,string>root;
 7 int n,m,t;
 8 string a,b;
 9 string find(string x){
10     if(root[x]!=x) return root[x]=find(root[x]);
11     return x;
12 }
13 int main(){
14     cin>>n>>m;
15     for(int i=1;i<=n;i++) cin>>a,root[a]=a;
16     for(int i=1;i<=m;i++){
17         cin>>a>>b;
18         if(find(a)!=find(b))
19         root[find(a)]=find(b);
20     }
21     cin>>t;
22     for(int i=1;i<=t;i++){
23         cin>>a>>b;
24         if(find(a)==find(b)) printf("Yes.
");
25         else printf("No.
");
26     }
27     return 0;
28 }
map真是个好东西。
好东西好东西,中国制造,好东西。(此处安利好东西//这不是小广告

一世安宁
 
原文地址:https://www.cnblogs.com/GTBA/p/9052171.html