博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

一中校运会之百米跑

题目传送门

题目背景

在一大堆秀恩爱的**之中,来不及秀恩爱的苏大学神踏着坚定(?)的步伐走向了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."。

输入输出样例

输入

106
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.

思路

同并查集的模板题

注意

不要打union函数,将函数内的东西都拿到主函数当中,这样不容易错,如果不拿可能出错的

代码

#include<bits/stdc++.h>//2256
using namespace std;
map<string,string>father;
string findFather(string x){
	if(x==father[x])return x;
	string f=findFather(father[x]);
	father[x]=f;
	return f; 
	
}






-------------------------------------------
/*void Union(stirng x,string y){
	string fA=findFather(x);
	string fB=findFather(y);
	if(fA!=fB)father[fA]=fB;
}*/
-------------------------------------------











int main(){
	int n,m;
	cin>>n>>m;
	string a,b,c;
	for(int i=1;i<=n;i++){
		cin>>a;
		father[a]=a;
	}
	for(int i=1;i<=m;i++){
		cin>>b>>c;
        
        
        
        
        
        
        
        
        
------------------------------------------- 
		  /*Union(b,c);*/
-------------------------------------------         









          
          
		string fa=findFather(b);
		string fb=findFather(c);
		if(fa!=fb){
			father[fa]=fb;
		}
	}
	int k;
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>b>>c;
		if(findFather(b)==findFather(c)){
			cout<<"Yes."<<endl;
		}
		else{
			cout<<"No."<<endl;
		}
	}
	return 0;
}
posted @ 2020-06-17 11:40  5656566  阅读(58)  评论(0)    收藏  举报