这个题是个裸地带权并查集,不会的先谷歌,后百度。
题目的题意是说有几个词,然后有几种关系,两个词之间有反义词或者是近义词,或者不确定的关系,求有没有谎话,以及q词查询,每次查询两个单词的关系。编号map一下就好了,这个题是4s,很长的时间了。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;
int n,m,q;
int f[200000];
int relation[200000];
string s[200000];
map<string,int >dic;
int Find(int x){
if(f[x]==x){
return x;
}
int olfa=f[x];
f[x]=Find(f[x]);
relation[x]=(relation[x]+relation[olfa])%2;
return f[x];
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>s[i];
dic[s[i]]=i;
}
for(int i=1;i<=n;i++){
f[i]=i;
relation[i]=0;
}
string s1,s2;
for(int i=1;i<=m;i++){
int x,z,y;
cin>>z>>s1>>s2;
z--;
x=dic[s1];
y=dic[s2];
int a=Find(x),b=Find(y);
if(a!=b){
f[b]=a;
relation[b]=(z+relation[x]-relation[y])%2;
printf("YES\n");
}
else{
int temp=(relation[x]-relation[y]+2)%2;
if(temp!=z)
printf("NO\n");
else
printf("YES\n");
}
}
for(int i=1;i<=q;i++){
cin>>s1>>s2;
int x=dic[s1],y=dic[s2];
int r1=Find(x),r2=Find(y);
if(r1!=r2){
printf("3\n");
}
else{
int temp=(relation[x]-relation[y]+2)%2;
printf("%d\n",temp+1);
}
}
return 0;
}