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

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

 

你可能感兴趣的:(life)