标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1829
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found!HintHuge input,scanf is recommended.
/**
hdu 1829 并查集(食物链的弱化版)
题目大意:给定n个昆虫,和m种恋爱关系,判断是否有同性恋
解题思路:并查集i-A表示i属于性别A若i-A和j-B,属于同一类,表示i为性别A和j为性别B是同时发生或者同时不发生。类似于poj1182
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=2005;
int par[maxn*2],_rank[maxn*2];
void init(int n)
{
for(int i=0; i<=n; i++)
{
par[i]=i;
_rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)
return x;
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
if(_rank[x]<_rank[y])
{
par[x]=y;
}
else
{
par[y]=x;
if(_rank[x]==_rank[y])
_rank[x]++;
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int main()
{
int T,tt=0,n,m;
scanf("%d",&T);
while(T--)
{
int flag=0;
scanf("%d%d",&n,&m);
init(n*2);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
if(same(x,y)||same(x+n,y+n))
{
flag=1;
}
else
{
unite(x,y+n);
unite(x+n,y);
}
}
printf("Scenario #%d:\n",++tt);
if(flag)
puts("Suspicious bugs found!\n");
else
puts("No suspicious bugs found!\n");
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/45849087