Background
Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interactions were easy to identify, because numbers were printed on their backs.
Problem
Given a list of bug interactions, decide whether the experiment supports his assumption of two genders with no homosexual bugs or if it contains some bug interactions that falsify it.
Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interactions were easy to identify, because numbers were printed on their backs.
Problem
Given a list of bug interactions, decide whether the experiment supports his assumption of two genders with no homosexual bugs or if it contains some bug interactions that falsify it.
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Scenario #1:
Suspicious bugs found!
Scenario #2:
No suspicious bugs found!
Huge input,scanf is recommended.
题解:
出乎意料并查集的题目我已经a了3题了没看一次题解qwq好高兴,这题也是没看题解做出来的hhh(之前被线段树虐怕了,自己解出来题都成了奢望),一开始思路和普通的并查集基本没啥区别,区别就是不要边查边缩短树了,还有就是要要加一个参数deep获得节点的深度,如果是同一棵树,深度abs(d1-d2)%2==0的话就是同性,就tag=0;否则就把第二颗树的头结点接到题目给的第一个节点上,看是否满足深度abs(d1-d2)%2==1,不满足就加一个空节点qwq我一开始也不知道这样能做出来,ac了好高兴
代码:
#include<stdio.h>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
int pre[1000005];//保存前向数组,我也不知道要不要开那么大
int maxx;
int find(int x,int deep)//deep保存与根的距离
{
if(maxx<deep)
maxx=deep;
if(x!=pre[x])
{
return find(pre[x],deep+1);
}
else
return x;
}
int main()
{
int i,j,ans,t,q,n,m,x,y,d1,d2,t1,t2,tag,k;
scanf("%d",&t);
for(q=1;q<=t;q++)
{
k=2001;//空节点的起始
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
pre[i]=i;
}
tag=1;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(tag)//发现有一组不符合就跳
{
if(x>y)
swap(x,y);
maxx=0;
d1=find(x,1);
t1=maxx;//获得深度
maxx=0;
d2=find(y,1);
t2=maxx;
if(d1==d2)
{
if(abs(t1-t2)%2==0)//性别相同
tag=0;
}
else
{
pre[d2]=x;
maxx=0;
find(y,1);
t2=maxx;
if(abs(t1-t2)%2==0)//如果添加后的树不满足性别相同,添加一个空节点
{
pre[k]=x;
pre[d2]=k;
k++;
}
}
}
}
printf("Scenario #%d:\n",q);
if(tag)
printf("No suspicious bugs found!\n");
else
printf("Suspicious bugs found!\n");
printf("\n");//神坑,pe了几次
}
return 0;
}