http://codeforces.com/problemset/problem/766/D
带权并查集
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<map>
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
struct node{
int pre;
int rel;
}set[maxn];
map <string,int> mp;
int fnd_rt(int x){
if(set[x].pre==x)
return x;
int fa=set[x].pre;
set[x].pre=fnd_rt(fa);
set[x].rel=(set[x].rel+set[fa].rel)%2;
return set[x].pre;
}
int main(){
int cnt=1;
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
set[i].pre=i;set[i].rel=0;
}
string a,b;
for(int i=1;i<=n;i++){
cin>>a;
mp[a]=cnt++;
}
int r;
for(int i=1;i<=m;i++){
cin>>r>>a>>b;
int ra=fnd_rt(mp[a]);
int rb=fnd_rt(mp[b]);
if(ra==rb){
if(r==1&&(set[mp[a]].rel+set[mp[b]].rel)%2==0)
cout<<"YES"<<endl;
else if(r==2&&(set[mp[a]].rel+set[mp[b]].rel)%2!=0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
continue;
}
else
cout<<"YES"<<endl;
set[ra].pre=rb;
set[ra].rel=(set[mp[a]].rel+r-1+set[mp[b]].rel)%2;
}
for(int i=1;i<=q;i++){
cin>>a>>b;
int ra=fnd_rt(mp[a]);
int rb=fnd_rt(mp[b]);
if(ra!=rb)
cout<<"3"<<endl;
else{
if((set[mp[a]].rel+set[mp[b]].rel)%2==0)
cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
}
return 0;
}