检验给出条件是否有同性恋。
思路:
条件并查集。
还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的,
那么如果说对于同类(同一个集合)的判断就sum[a]是否等于sum[b]
对于不同类的话,就是他们的关系取反。
考虑状态压缩中,关系就是叠加。
一直wa,wa在Find以后是判断各自的关系。
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
int pre[N],n,sum[N],m;
bool flag;
int Find(int x)
{
if(pre[x]==x)
return x;
int temp=pre[x];
pre[x]=Find(temp);
sum[x]=(sum[x]+sum[temp])%2;
return pre[x];
}
void Merge(int x,int y)
{
int xx=Find(x);
int yy=Find(y);
if(xx==yy)
{
if(sum[x]==sum[y])
flag=false;
}
else{
pre[xx]=yy;
sum[xx]=(sum[y]+sum[x]+1)%2; //父子之间不是同性恋;
}
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
pre[i]=i;
sum[i]=0;
}
flag=true;
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
if(!flag) continue;
Merge(x,y);
}
printf("Scenario #%d:\n",cas++);
if(flag)
puts("No suspicious bugs found!");
else
puts("Suspicious bugs found!");
puts("");
}
return 0;
}