题目链接:http://codeforces.com/problemset/problem/766/D
题目大意:给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES
然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出1 反义词输出2 不确定输出3
思路:用长度为2n的并查集就可以了。f[a]为a的同义集合。f[a+n]为a的反义集合。
合并的时候处理一下就可以了。
#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
int fa[200005];
int fd(int u){
if(fa[u]==u){
return u;
}
else{
return fa[u]=fd(fa[u]);
}
}
int main(){
int n, m, k, cut=1;
scanf("%d%d%d", &n, &m, &k);
string a;
for(int i=1; i<=n; i++){
cin>>a;
mp[a]=cut++;
fa[i]=i;
fa[i+n]=i+n;
}
for(int i=1; i<=m; i++){
int op, ta, tb, ba, bb;
string a, b;
cin>>op>>a>>b;
ta=fd(mp[a]);
tb=fd(mp[b]);
ba=fd(mp[a]+n);
bb=fd(mp[b]+n);
if(op==1&&(ta==bb||tb==ba)||op==2&&(ta==tb)){
printf("NO\n");
}
else{
printf("YES\n");
if(op==1){
fa[ta]=tb;
fa[ba]=bb;
}
else{
fa[ta]=bb;
fa[ba]=tb;
}
}
}
for(int i=1; i<=k; i++){
string a, b;
cin>>a>>b;
int a_=mp[a], b_=mp[b];
int ta=fd(a_), tb=fd(b_);
int ba=fd(a_+n), bb=fd(b_+n);
if(ta==tb){
printf("1\n");
}
else if(ta==bb){
printf("2\n");
}
else{
printf("3\n");
}
}
return 0;
}