题目链接: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:
Suspicious bugs found!
",T-t);
else printf("Scenario #%d:
No suspicious bugs found!
",T-t);
}
return 0;
}