一、题目回顾
题目链接:传送门
题意:给定n只虫子,不同性别的可以在一起,相同性别的不能在一起。给你m对虫子,判断中间有没有同性别在一起的。
二、解题思路
- 种类并查集
- 和poj1073的本质一样
- 详见poj1073题解
大概思路:每得到一对虫子就判断下他们是否在同一个集合,并且他们的性别是否相同,如果相同则有同性恋,后面就算输入数据也不用做处理了,否则就一直处理下去。
三、代码
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 100000+10;
int pre[maxn]; //存父亲节点
int r[maxn]; //存与根节点的关系,0 代表同类, 1代表不同类
int T,n,m;
void init()
{
for(int i=1;i<=n;i++){
pre[i] = i;
r[i] = 0;
}
}
int find(int x)
{
if(x == pre[x]) return x;
int t = pre[x];
pre[x] = find(pre[x]);
r[x] = (r[x]+r[t])%2;
return pre[x];
}
void unite(int x,int y)
{
int fx = find(x);
int fy = find(y);
pre[fx] = fy;
r[fx] = (r[x]+1+r[y])%2;
}
int main()
{
scanf("%d",&T);
int kase = 1;
while(T--){
scanf("%d%d",&n,&m);
init();
int a,b,flag=0;
while(m--){
scanf("%d%d",&a,&b);
if(find(a)==find(b)){
if(r[a]==r[b]){
flag = 1;
}
}
else{
unite(a,b);
}
}
printf("Scenario #%d:
",kase++);
if(flag==1) printf("Suspicious bugs found!
");
else printf("No suspicious bugs found!
");
}
return 0;
}