题解 并查集 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;
}
浙公网安备 33010602011771号