DongDong认亲戚
题目描述
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
Code
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//堆/优先队列
// #include <queue>//队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const ll N=2e4+10;
ll p[N];//亲戚编号
map<string,ll> mp;
//查找祖先的函数
ll find(ll x)//返回x的祖先节点+路经压缩
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
void solve()
{
ll n,m;
cin>>n>>m;
ll cnt=0;
while(n--)
{
string s;
cin>>s;
if(mp[s]) continue;
p[++cnt]=cnt;
mp[s]=cnt;
}
while(m--)
{
ll op;
cin>>op;
if(op==1)
{
string a,b;
cin>>a>>b;
ll pa,pb;
//查找祖先的函数
pa=find(mp[a]);
pb=find(mp[b]);
//相同亲戚关系
p[pa]=pb;
}
else
{
string a,b;
cin>>a>>b;
ll pa,pb;
//查找祖先的函数
pa=find(mp[a]);
pb=find(mp[b]);
if(pa==pb) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ll t=1;
//cin>>t;
while(t--) solve();
return 0;
}

被折叠的 条评论
为什么被折叠?



