1. 程式人生 > 實用技巧 >poj2492 A Bug's Life

poj2492 A Bug's Life

題目連結:https://vjudge.net/problem/POJ-2492

簡單題意:給定一些蟲子和他們之間的交往關係,判斷它們中是否有同性戀蟲

設v[x]=0表示x和par[x]同性,v[x]=1異性,然後用帶權並查集做就可以了,算是食物鏈的簡化版(只有兩個關係)

#include<cstdio>

int t,T,n,m,i,j,x,y,f;
int par[2010],v[2010];

int find(int x){ //*帶權並查集模板 
	if (x!=par[x]) {
	  int u=par[x];
	  par[x]=find(par[x]);
	  v[x]=(v[x]+v[u])%2;
	}
	return par[x];
}

int main(){
	scanf("%d",&t); T=t;
	while (t--){
	  scanf("%d%d",&n,&m); f=0;
	  for (i=1;i<=n;i++){ 
	    v[i]=0; par[i]=i;
	  }
	  for (i=1;i<=m;i++){
	  	scanf("%d%d",&x,&y);
	  	int xx=find(x);int yy=find(y);
	  	if (xx==yy){
	  	  int d=(v[x]+v[xx]-v[y]+2)%2; //*
	  	  if (d==0) f=1;  //x,y同性 
		}
		else {
		  par[xx]=yy; v[xx]=(1+v[y]-v[x])%2; //*
		} 
	  }
	  if (f==1) printf("Scenario #%d:\nSuspicious bugs found!\n\n",T-t);	  
	  else printf("Scenario #%d:\nNo suspicious bugs found!\n\n",T-t);
	}
	return 0;
}