您的位置:首页 > Web前端

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

2017-09-02 16:57 399 查看
题意:

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

用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
,r
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息