カテゴリー互いに素セット[noi2001食物連鎖]

トピックへのリンク:http://cogs.pro:8081/cogs/problem/problem.php?pid=pxNJzxVPU

タイトル3匹、AはB、BがCを食べて食べて、Cを食べます

Bである食品、AはこれにB天敵である、と。

したがって3の組が存在してもよい、0-Nは、捕食者を表し動物、NN + Nは、それらの食糧、N + NN * 3を表すことを意味します。

コードは以下の通りであります:

#define _CRT_SECURE_NO_WARNINGS 
の#include <iostreamの> 
する#include <cstdioを>
 の#define MAXN 50100
 使用して 名前空間STD;
 INT N、K、D、X、Y、
 INT ANS = 0 ;
 int型のプレ[* MAXN 。3 ];              // n型種であります食品N + N、N * 3つの天敵は、
 
int型(検索INT X)
{ 
    IF(X == [X] PRE)
         のリターン; Xを
     返す事前[X]を= (予備[X])を検索
} 
 
ボイド連合(INTを X-、INTY)
{ 
    事前[(X)検索] = (y)を見つけます。
} 
 
int型のmain()
{ 
    freopenは(" eat.in "" R " 、STDIN)。
    freopenは(" eat.out "" W " 、STDOUT)。
    scanf関数(" %d個の%のD "、&​​N&K)。
    以下のためにint型 iは= 0 ; iがN * < 3 ; iは++ 
        事前[I] = I。
 
    一方、(K-- 
    {
        scanf関数(" %D%D%D "、D&&X&Y)、
         IF(X> N || Y> N)
            ANS ++ ;
         
        { 
            IF(D == 1 
            {        // 食品をx捕食者のxまたはyがyは
                IF(検索(X + N)==検索||(y)を探す(N * X + 2)== 検索(Y))
                { 
                    ANS ++ ;
                     続行; 
                } 
                そう  // XYその種類は、XY食べ物が似ている、XYの捕食者は似ています
                {
                    連合(X、Y); 
                    ユニオン(X + N、Y + N); 
                    ユニオン(X +(N << 1。 )、Y +(N << 1 )); 
                } 
            } 
            
            { 
                IF(X == Y | |検索(X)==)(Y + N)検索==(x)の検索||(y)を見つけ    // xとyは、食品グレードで
                { 
                    ANS ++ ;
                     続行; 
                } 
                 // xとy同様の捕食者、xおよびyは同じ食品であり、xとyの捕食者は、食品グレードである
                { 
                    連合の(X、Yと +(N << 1)); 
                    連合(X + N、Y); 
                    連合(X +(N << 1)、Y + N)。
                } 
            } 
        } 
    } 
    のprintf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/kxxy/p/11721368.html