可以看作是POJ1703的升级版,可以先做一做1703这个题;
需要多维护一下x,y,和x+n,y+n
#include<bits/stdc++.h> using namespace std; const int MAXN=2e5+10; const int MOD=1e9+7; map<string,int >ma; int n,m,q; int pri[MAXN]; int find(int x) { if(pri[x]==x) return x; return pri[x]=find(pri[x]); } void mix(int a,int b) { int x=find(a),y=find(b); if(x!=y) pri[x]=y; } int main() { scanf("%d%d%d",&n,&m,&q); string s; for(int i=1;i<=n;i++) { cin>>s; ma[s]=i; } for(int i=0;i<=n+n;i++) { pri[i]=i; } for(int i=0;i<m;i++) { int a; string x,y; cin>>a>>x>>y; int kx=find(ma[x]); int ky=find(ma[y]); if(a==1) { if(find(ma[x]+n)==find(ma[y])||find(ma[x])==find(ma[y]+n)) { printf("NO "); } else { printf("YES "); mix(ma[x],ma[y]); mix(ma[x]+n,ma[y]+n); } } else if(a==2) { if(kx==ky||find(ma[x]+n)==find(ma[y]+n)) { puts("NO"); } else { mix(ma[x],ma[y]+n); mix(ma[x]+n,ma[y]); printf("YES "); } } } for(int i=0;i<q;i++) { string x,y; cin>>x>>y; int kx=find(ma[x]); int ky=find(ma[y]); if(kx==ky||find(ma[x]+n)==find(ma[y]+n)) printf("1 "); else if(find(ma[x])==find(ma[y]+n)||find(ma[x]+n)==find(ma[y])) printf("2 "); else printf("3 "); } return 0; }