题目来源: poj 2492
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
const int maxn = 100010;
int n, m;
int father[maxn];
int rel[maxn];
void init()
{
for (int i = 0; i <= n; i++)
{
father[i] = i;
rel[i] = 0;
}
}
int find(int x)
{
if (father[x] == x)
{
return x;
}
else
{
int tf = father[x];
father[x] = find(father[x]);
rel[x] ^= rel[tf];
return father[x];
}
}
bool unite(int x, int y)
{
int faX = find(x);
int faY = find(y);
if (faX != faY)
{
father[faY] = faX;
rel[faY] = (rel[y] + 1 + rel[x]) % 2;
}
else
{
if ((rel[y] + rel[x]) % 2 != 1)
{
return false;
}
}
return true;
}
int main()
{
int T;
cin >> T;
int count = 1;
while (T--)
{
scanf("%d %d", &n, &m);
init();
bool flag = true; //没有矛盾
while (m--)
{
int u, v;
scanf("%d%d", &u, &v);
if (unite(u, v) == false)
{
flag = false;
}
}
if (flag)
{
cout << "Scenario #" << count++ << ":" << endl;
cout << "No suspicious bugs found!" << endl;
}
else
{
cout << "Scenario #" << count++ << ":" << endl;
cout << "Suspicious bugs found!" << endl;
}
cout << endl;
}
return 0;
}