您的位置:首页 > Web前端

poj 2492 并查集 a bug's life

2012-02-29 22:09 399 查看
题意:给出一些不同种类的昆虫,然后判断给出的关系中是否有矛盾的关系。

思路:带关系类型的并查集,不同种类的昆虫进行合并,同时更新关系。

#include<iostream>
using namespace std;
struct node
{
int parent;
int relation;
}p[2010];
int N;
void make_set()
{
for(int i=1;i<=N;i++)
{
p[i].parent=i;
p[i].relation=0;
}
}
int find_set(int x)
{
if(x==p[x].parent)  return x;
else
{
int t=p[x].parent;
p[x].parent=find_set(t);
p[x].relation=(p[x].relation+p[t].relation)%2;
}
return p[x].parent;
}
void join(int x,int y,int d)
{
int r1,r2;
r1=find_set(x);
r2=find_set(y);
if(r1!=r2)
{
p[r1].parent=r2;
p[r1].relation=(2+p[y].relation-p[x].relation+d)%2;
}
}
int main()
{
int T,M;
int a,b;
int h=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
int flag=true;
make_set();
while(M--)
{
scanf("%d%d",&a,&b);
join(a,b,1);
if(find_set(a)==find_set(b))
{
if(p[a].relation==p[b].relation)//一个集合中(不同种类的集合),如果出现同种类的昆虫,那么就是矛盾的。
flag=false;
}
}
if(flag)
{
printf("Scenario #%d:\n",h++);
printf("No suspicious bugs found!\n\n");
}
else
{
printf("Scenario #%d:\n",h++);
printf("Suspicious bugs found!\n\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: