您的位置:首页 > Web前端

HDU 1829 A Bug's Life (并查集)

2015-01-17 20:51 288 查看
题目链接:请戳这里。

题目大意及思路:给定n个Bugs(shen me gui)和m对Bugs之间的关系,假定关系是两个Bugs的男女关系,那么问存不存在同性恋的情况。

那么若a与b是男女关系,b与c是男女关系,那么a和c的性别我们就可以认为是相同的。我们用可以建立两个并查集,一类放男男关系,一类放女女关系。

那么若男男关系中出现了环的情况(即有共同的根),那么同性恋关系就出现了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 2000+10
using namespace std;

int ok;
int f
,p
; //用p[]表示男女关系。
void Init(int n)
{
for(int i=1;i<=n;i++)
{
f[i]=i;
p[i]=0;
}
}
int Find(int x)
{
return x==f[x]?x:f[x]=Find(f[x]);
}
void Merge(int a,int b) //a和b有男女关系。
{
int ra=Find(a),rb=Find(b);
if(ra==rb) { //存在同性恋。
ok=0;
return;
}
if(p[ra]) f[p[ra]]=rb; //p[ra]和rb是同种关系(男男)
if(p[rb]) f[p[rb]]=ra; //p[rb]和ra是同种关系(女女)
p[ra]=rb;
p[rb]=ra;
}
int main()
{
int T,C=0;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
Init(n); ok=1;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
Merge(a,b);
}
printf("Scenario #%d:\n",++C);
if(ok) puts("No suspicious bugs found!");
else puts("Suspicious bugs found!");
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息