题目描述
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
典型的map+并查集,啥是map?啥是并查集?抱歉我讲不清楚自行百度。
这种直接套的裸题是真的没啥好讲的,上代码:
#include"bits/stdc++.h"
using namespace std;
map<string,int> M;
int pre[500010];
int find(int x){
if(pre[x]==x) return pre[x];
else return pre[x]=find(pre[x]);
}
int pd(int a,int b){
if(find(a)==find(b))return 1;
else return 0;
}
void Union(int a,int b){
int q = find(a),p = find(b);
pre[q] =find(b);
}
int main(){
int n,m;
cin >> n >> m;
for(int i = 0;i < n;i++)
{string str;
cin >> str;
M[str] = i;
pre[i] = i;
}
while(m--){
int opt;
string s1,s2;
cin >>opt;
//getchar();
cin >>s1>>s2;
if(opt == 1)
Union(M[s1],M[s2]);
else{
if(find(M[s1])==find(M[s2])) puts("1");
else puts("0");
}
}
}