题解 并查集 POJ 2492
题目大意:
输入n个bug,bug之间有interaction,当前假设异性之间才interaction,但是需要验证,给定这些interaction对,判定是否满足假设,如果男<->女和女<->男,满足条件,如果存在男<->男或者女<->女,则假设不满足。
方法:
采用并查集拓展,加入relations[]数组,其中relations[x]表示x和父节点关系,relations[x] = 0表示x和父节点关系为同性,relations[x] = 1表示x和父节点关系为异性。
代码:
#include <iostream> #include <cstdio> using namespace std; int par[1000000],relation[1000000];//relation表明与父亲节点的关系,0为同性,1为异性。 int get(int a) { int t=par[a]; if(par[a]==a) return a; par[a]=get(t); relation[a]=(relation[a]+relation[t])%2;//从父亲节点逐次向下更新 return par[a]; } void merge(int a,int b) { int p1=get(a); int p2=get(b); if(p1==p2) return ; par[p2]=p1; relation[p2]=(relation[b]-relation[a]+1)%2; } int main() { int i,T,num=1; scanf("%d",&T); while(T--) { int a,b,n,m,flag=0; scanf("%d%d",&n,&m); for(i=0;i<=n;i++) par[i]=i,relation[i]=0; while(m--) { scanf("%d%d",&a,&b); if(get(a)==get(b)) { if(relation[a]!=(relation[b]+1)%2) flag=1; } else merge(a,b); } if(flag!=0) printf("Scenario #%d:\nSuspicious bugs found!\n\n",num++); else printf("Scenario #%d:\nNo suspicious bugs found!\n\n",num++); } return 0; }