食物連鎖(互いに素セット古典的なタイトル)

アイデア:この質問を書くhttps://www.cnblogs.com/2462478392Lee/p/11343747.html理解しやすいです、そしてアイデアを思い付きました。3×n個のアレイを開き、xとyの種類、捕食者、および獲物は、拡張されたドメインを行います

そして、互いに素セットを行う関係を使用して、それぞれの場合には3を持っています。XおよびYが同じで、同じ種類の獲物、xとyの捕食捕食、獲物とy X。場合餌のX、Y、捕食者のxとy、獲物のX

そして、捕食者-Y yを、獲物のX。確立した後、現在の状況を満たすために、あなたは答えを見つけることができますセットをチェックしませんどのように多くのセットを確認してください。

 

#include <CStringの> 
する#include <アルゴリズム> 
の#include <ベクトル> 
の#include <地図> 
の#include <キュー> 
の#include <cstdioを> 
する#include <cmath>
 の#define LL長い長い
 使用して 名前空間STD。
int型 FA [ 2000000 ]。
INT  GETint型k)は
{ 
    返す FA [k]を== K K:FA [K] = GET (FA [K])。
} 
ボイドマージ(int型のx、int型のY)
{ 
    FA [ (X)] = GET(Y)
} 
int型のmain()
{ 
    int型、N M。
    scanf関数(" %d個の%のD "、&​​N、&M)。
    以下のためにint型 i = 1 ; iは= < 3 * N; iは++ 
    { 
        FA [I] = I。
    } 
    INT ANS = 0 以下のためにint型 iは= 1 ; iが<= M iは++ 
    { 
        int型、B、Cと、
        scanf関数(" %D%D%D "、&​​、&B、&C)。
        もし(B> N || C>n)は
        ANS ++ ;
        そう であれば(== 1 
        {         
            場合取得(B)== 得る(C + N)|| 得る(B)== 得る(C + N + N))が
            ANS ++ 
            { 
                (B、C)をマージします。
                (Bマージ + N、C + N)。
                (Bマージ + N + N、C + N + N)。
            } 
        } 
        
        { 
            場合(Bの== cは|| 得る(B)== 得ます(C)|| 取得 ==(C + N)を取得する(B))
            ANS ++ 
            { 
                マージ(B + N、C)。
                マージ(B、C + N + N)。
                (Bマージ + N + N、C + N)。
            } 
        } 
    } 
    のprintf(" %d個の\ n " 、ANS)。
}

 

おすすめ

転載: www.cnblogs.com/2462478392Lee/p/11343788.html