当前位置: 代码迷 >> 综合 >> POJ2492 -A Bug's Life(种类并查集)
  详细解决方案

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

热度:52   发布时间:2023-11-06 18:36:29.0

题意:

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

用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;
}



  相关解决方案