第一次接触这种分组的并查集,分集团的思想:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <stack>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define MAXN 1000000
int pre[MAXN*2];//开一个大一点的数组,前面的存储一个性别的,后面的再存储一个性别的
int root(int a)//寻找根节点
{
while(a!=pre[a])
a = pre[a];
return a;
}
void merge(int a, int b)//合并
{
int x = root(a);
int y = root(b);
if(x!=y)
pre[x] = y;
}
int main()
{
int t, n, m;
scanf("%d", &t);//组数
for(int i=1;i<=t;i++)
{
for(int k=1;k<=2*MAXN;k++)
pre[k] = k;//初始化
int flag = 1;//标记
scanf("%d %d", &n, &m);
for(int j=1;j<=m;j++)
{
int x, y;
scanf("%d %d", &x, &y);
if(flag==0)//已经找到性别相同的
continue;
if((root(x+n)==root(y+n))||(root(x)==root(y)))//根节点一样,性别相同
{
flag = 0;//标记
continue;
}
else
{
//合并
merge(x, y+n);
merge(x+n, y);
}
}
printf("Scenario #%d:\n", i);
if(flag==0)
printf("Suspicious bugs found!\n\n");//输出空行
else
printf("No suspicious bugs found!\n\n");
}
return 0;
}