题目链接:http://poj.org/problem?id=2492
题意:一种bug有两种性别,现在某个教授想看看他们有木有同性恋,输入的两个数是这两个编号的bug不是一种性别,如果有同性恋就输出Suspicious bugs found!,否则就输出后面一个。
思路:就是分成两种种类的并查集,1-n-代表雄,n+1-2*n+1代表雌,然后判断就行了(只需要判断一种情况就行了,因为两种情况是同步的,u男v女和u女v男是一样的)
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <numeric>
#include <set>
#include <string>
#include <cctype>
#include <sstream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 2e3 + 5;
int t,n,m,p[maxn];
void init (int n) {for (int i=0;i<n;i++) p[i]=i;}
int Find(int x) {return p[x]==x?x: ( p[x]=Find ( p[x] ) );}
bool same(int a,int b) {return Find(a)==Find(b);}
void unite (int x,int y)
{
x=Find(x);
y=Find(y);
if (x!=y) p[x]=y;
}
int main () {
//freopen ("in.txt", "r", stdin);
int k=0;
scanf ("%d",&t);
while (t--){
scanf ("%d%d",&n,&m);
init(n<<1);
bool flag=0;
for (int i=0;i<m;i++){
int u,v;
scanf ("%d%d",&u,&v);
if (same(u,v)) flag=1;
else {
unite(u,v+n);
unite(u+n,v);
}
}
if (flag) printf ("Scenario #%d:\nSuspicious bugs found!\n\n",++k);
else printf ("Scenario #%d:\nNo suspicious bugs found!\n\n",++k);
}
return 0;
}