题解 并查集 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;
}



posted on 2014-10-06 11:44  一锅土豆  阅读(114)  评论(0编辑  收藏  举报