题目意思:0代表name1和name2是伙伴,1代表查询name1和name2是否是伙伴。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 100010
using namespace std;
map <string,int>mapt;
int f[maxn];
int find(int x){
if(f[x]==x)rt x;
rt f[x]=find(f[x]);
}
void merge(int a,int b){
int x=find(a);
int y=find(b);
f[y]=x;
}
int main(){
#ifdef ACBang
freopen("in.txt","r",stdin);
#endif
for(int i=0;i<maxn;i++)f[i]=i;
int n;sf("%d",&n);
int cnt=1;
while(n--){
int k;
string s1,s2;
cin>>k>>s1>>s2;
if(k==0){
if(mapt.find(s1)==mapt.end())
mapt[s1]=cnt++;
if(mapt.find(s2)==mapt.end())
mapt[s2]=cnt++;
merge(mapt[s1],mapt[s2]);
}
else{
if(mapt.find(s1)==mapt.end()||mapt.find(s2)==mapt.end() ){
puts("no");
continue;
}
int x=find(mapt[s1]);
int y=find(mapt[s2]);
// cout<<mapt[s1]<<" "<<mapt[s2]<<endl;
// cout<<x<<" "<<y<<endl;
if(x==y)puts("yes");
else puts("no");
}
}
rt 0;
}