您的位置:首页 > Web前端

POJ 2492 A Bug's Life(并查集)

2014-02-12 09:15 519 查看
http://poj.org/problem?id=2492

题意 :就是给你n条虫子,m对关系,每一对关系的双方都是异性的,让你找出有没有是同性恋的。

思路 :这个题跟POJ1703其实差不多,也是需要一个数组来存跟父亲节点的关系,需要两个集合来存是否有关系,在最后稍微变一下形就OK了。

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

int pre[100010];//代表着父亲结点,如果D后边是a b,则pre[b]=a ;
int father[100010] ;//代表着这个点和父亲结点的关系,是属于同一类还是不同团伙
int m,n ;

int find(int x)
{
int temp = pre[x] ;
if (pre[x] == x)
return x ;
pre[x] = find(pre[x]);
father[x] = father[x] == father[temp] ? 0 : 1 ;//等于0表示属于同一类
return pre[x];
}

void unionn(int x,int y,int xx,int yy)
{
pre[xx] = yy ;
father[xx] = father[x] == father[y] ? 1 : 0 ;
}
int main()
{
int t ;
scanf("%d",&t) ;
int m,n ,kase = 1;
while(t--)
{
scanf("%d %d",&n,&m) ;
for(int i = 1 ; i <= n ; i++)
{
pre[i]=i;
father[i] = 0 ;
}
bool flag = false ;
int a,b ;
for(int i = 1 ; i <= m ; i++)
{
scanf("%d %d",&a,&b) ;
int aa = find(a),bb = find(b);
if(!flag)
{
if(aa != bb)
unionn(a,b,aa,bb) ;
else
{
if(father[a] == father[b])
flag = true ;
}
}
}
printf("Scenario #%d:\n",kase) ;
kase++ ;
if(flag)
printf("Suspicious bugs found!\n\n") ;
else printf("No suspicious bugs found!\n\n") ;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: