题号:NC23803
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义:若A和B是亲戚,B和C是亲戚,那么A和C也是亲戚),她只好求助于会编程的你了。
输入描述:
第一行给定n,m表示有n个人,m次操作 第二行给出n个字符串,表示n个人的名字分别是什么(如果出现多个人名字相同,则视为同一个人)(保证姓名是小写字符串) 接下来m行,每行输入一个数opt,两个字符串x,y 当opt=1时,表示x,y是亲戚 当opt=2时,表示询问x,y是否是亲戚,若是输出1,不是输出0 数据范围:1<=n,m<=20000,名字字符长度小等于10
输出描述:
对于每个2操作给予回答
示例1
输入
复制
4 4 chen lin yi cheng 2 chen lin 1 chen lin 1 yi lin 2 yi lin
输出
复制
0 1
并查集模版题
#include <iostream>
#include <map>
using namespace std;
map<string,string>mp;
string find(string x){
return mp[x]==x?x:mp[x]=find(mp[x]);
}
void merge(string s1,string s2){
if(find(s1)!=find(s2)) mp[find(s1)]=find(s2);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
string s;
cin>>s;
mp[s]=s;//mp初始化
}
while(n--){
int op;
string s1,s2;
cin>>op>>s1>>s2;
if(op==1){
merge(s1,s2);
}else{
if(find(s1)==find(s2)) cout<<1<<endl;
else cout<<0<<endl;
}
}
return 0;
}