题意:给你一个T表示T组数据,之后一个n,m表示n个人,m组关系,m组关系式这样的 a b 表示 a和b可以xxoo(没错就是你们想的那个xxoo),之后问你有没有发现性取向不正常的那种人(捂脸。。。)
思路:带权并查集。。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int maxn = 2200;
using namespace std;
int p[maxn],Rank[maxn],flag;
int getf(int x)
{
if(x == p[x]) return p[x];
int t = p[x];
p[x] = getf(p[x]);
Rank[x] = (Rank[x] + Rank[t])%2;
return p[x];
}
void init()
{
for(int i = 0 ; i < maxn ; i++)
{
p[i] = i;
Rank[i] = 0;
}
}
void merge(int x,int y)
{
int dx = getf(x);
int dy = getf(y);
if(dx != dy)
{
p[dy] = p[dx];
Rank[dy] = (Rank[x] - Rank[y] +1) %2;
}
if(dx == dy)
{
if((Rank[x] + Rank[y])%2 == 0)
{
flag = 1;
}
}
}
int main()
{
int t;
scanf("%d",&t);
int cnt = 0 ;
while(t--)
{
init();
int n,m,a,b;
flag = 0 ;
scanf("%d%d",&n,&m);
for(int i = 0 ; i < m ; i++)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
printf("Scenario #%d:\n",++cnt);
if(flag)
{
puts("Suspicious bugs found!\n");
}
else
{
puts("No suspicious bugs found!\n");
}
}
return 0;
}