题目链接:http://poj.org/problem?id=2492
题意:给你m对虫子 判断中间有没有同性别在一起的
思路:基础种类并查集
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
const int maxn = 10005;
int n, m, T;
int pre[2 * maxn], value[2 * maxn], Rank[2 * maxn];
void init()
{
for(int i = 0; i <= 2 * n; i++)
{
pre[i] = i;
Rank[i] = 0;
}
}
int Find(int x)
{
return x == pre[x] ? x : pre[x] = Find(pre[x]);
}
void uni(int x, int y)
{
x = Find(x), y = Find(y);
if(x == y)
{
return ;
}
if(Rank[x] < Rank[y])
{
pre[x] = y;
return ;
}
else
{
pre[y] = x;
if(Rank[x] == Rank[y])
Rank[x]++;
return ;
}
}
bool dif(int x, int y)
{
if(Find(x + n) == Find(y) || Find(x) == Find(y + n))
{
return 1;
}
return 0;
}
bool same(int x, int y)
{
if(Find(x) == Find(y))
{
return 0;
}
return 1;
}
int main()
{
int ca;
cin >> T;
ca = 1;
while(T--)
{
bool flag = 0;
cin >> n >> m;
init();
for(int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d", &a, &b);
if(flag) continue;
if(same(a, b) || same(a + n, b + n))
{
uni(a + n, b);
uni(a, b + n);
}
else flag = 1;
}
printf("Scenario #%d:\n", ca++);
if(flag)
{
cout << "Suspicious bugs found!\n" << endl;
}
else
cout << "No suspicious bugs found!\n" << endl;
}
return 0;
}