POJ2492 -A Bug's Life(种类并查集)

118 阅读1分钟

题意:

跟食物链那题差不多,不过更简单。寻找是否存在同性恋的虫子。

用r[i]表示跟i与根节点的关系,1表示不同性别,0表示同性。每次只要检查r[a]与r[b]是否相等就可以。

ps:自己脑抽突然在判断r[a]和r[b]关系的时候写了个选择语句,无情wa多次,wa到怀疑人生。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int N=2100;
#define inf 0x3f3f3f3f
int n,m,f[N],r[N],flag;
int find(int x){
	int te=f[x];
	if(te==x) return x;
	f[x]=find(f[x]);
	r[x]=(r[x]+r[te])%2;
	return f[x];
}
void uni(int r1,int r2){
	int x=find(r1);
	int y=find(r2);
	if(x!=y){
		f[x]=y;
		r[x]=(1-r[r1]+r[r2])%2;
	}
}

int main(){
	int T,ca=1;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		flag=1;
		for(int i=1;i<=n;i++)
			f[i]=i;
		memset(r,0,sizeof(r));
		for(int i=0;i<m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			if(find(a)==find(b)){
				 if(r[a]==r[b])//当时就是在这里抽风,写了选择语句,导致flag=0后还会被修改为1;
					flag = 0;  
			}
			else{
				uni(a,b);
			}			
		}
		if(flag) printf("Scenario #%d:\nNo suspicious bugs found!\n\n",ca++);
		else printf("Scenario #%d:\nSuspicious bugs found!\n\n",ca++);
	}
	return 0;
}


\

\