アイデア:この質問を書く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 GET(int型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)。 }