给节点增加一个域,纪录与父节点的关系,是相同还是不同。 #include <iostream> using namespace std; const int maxn=100005; struct Node { int parent; bool same; }person[maxn]; int Find(int x,bool& same) { same=true; while(person[x].parent>=0) { if(!person[x].same) same=!same; x=person[x].parent; } return x; } void Union(int x,int y) { bool flag1,flag2; int a=Find(x,flag1); int b=Find(y,flag2); if(a!=b) { flag1=flag1!=flag2; if(person[a].parent>person[b].parent) { person[b].parent+=person[a].parent; person[a].parent=b; person[a].same=flag1; } else { person[a].parent+=person[b].parent; person[b].parent=a; person[b].same=flag1; } } } int main() { int t; scanf("%d",&t); while(t--) { int N,M; scanf("%d%d",&N,&M); memset(person,-1,sizeof(person)); char opt; int a,b; bool flag1,flag2; for(int i=0;i<M;i++) { scanf("/n"); scanf("%c%d%d",&opt,&a,&b); if(opt=='D') Union(a,b); else { a=Find(a,flag1); b=Find(b,flag2); if(a!=b) printf("Not sure yet./n"); else if(flag1==flag2) printf("In the same gang./n"); else printf("In different gangs./n"); } } } return 0; }