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

题意:有N只虫子和M个配对关系,问是否有两个虫子是同性的。

思路:这题和1703题很相似,也是判断两个虫子是否在一个集合中,稍微一改上一题的代码就行了。

1、输入两个虫子的编号,先判断这两个虫子是否是在一个集合,若是,直接标记。

2、若不是,判断一下这两只虫子在上面是否给出了配对关系,若没有,则它的相反数组就记录这组数据中它的相反虫子的编号。

3、若已经给出,则直接将它们相反虫子的编号连接起来。

代码:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#define N 2004
using namespace std ;

int f[N] , opp[N] ;

void init( int n )
{
    int i ;
    for ( i = 0 ; i <= n ; i++ )
    {
        f[i] = i ;
        opp[i] =  0;
    }
}

int find ( int x )
{
    if ( x != f[x] )
    f[x] = find ( f[x] );
    return f[x] ;
}

int main()
{
    int cas , n , m , x , y , i ;

    scanf ( "%d", &cas );
    for ( int c = 1 ; c <= cas ; c++ )
    {
        scanf ( "%d%d" , &n , &m );
        init( n ) ;
        int flag = 0 ;
        for ( i = 1 ; i <= m ; i++ )
        {
            scanf( "%d%d" , &x , &y );
            if ( flag )
            continue ;
            x = find ( x ) ;
            y = find ( y ) ;
            if ( x == y )
            {
                flag = 1 ;
                continue ;
            }
            if ( !opp[x] ) opp[x] = y ;
            if ( !opp[y] ) opp[y] = x ;
            opp[x] = find ( opp[x] ) ;
            opp[y] = find ( opp[y] ) ;
            f[opp[x]] = y ;
            f[opp[y]] = x ;
        }
        printf ( "Scenario #%d:\n" , c );
        if ( !flag )
        {
            printf ( "No suspicious bugs found!\n" );
        }
        else
        {
            printf ( "Suspicious bugs found!\n" );
        }
        if ( c != cas )
        printf( "\n" );
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/misty1/p/2615337.html