リンク:http://poj.org/problem?id=1182
相対的な関係を維持するために、互いに素セット。
そして、敵の敵を解決するためには、解決す互いに素セットのようなもので、この関係の(円対称である)私の友人であります
三つ以上のセット限り、各セットは等価であり、各セットの間の関係が同等であれば、保守は互いに素なセットタイプを用いて行うことができます。
質問の意味:
観察下に、(一般的慣行互いに素なセット)を解決するための3つの互いに素なセットタイプのセットに見出すことができる:三重メンテナンスI + n iは獲物を表し、I + 2Nと、互いに素な集合のサイズとすることができます私は天敵を表します。
2匹の動物の重み(加重互いに素なセットアプローチ)加重互いに素なセットは、食物連鎖上の相対関係を示すA-> B = 0(同じ)、A-> B = 1(A Bを食べます)、A- > B = 2(B Aを食べます)。
3点に注意してください。
図1に示すように、圧縮パス、値の値を更新する方法:
A-> BはA-> Cを求めているか、1から1、B-> Cのですか?明らかA Bを食べ、B、Cを食べる、CはAを食べる必要があり、A-> Cは2であるべきです。
A->はBはA-> Cを見つける方法を、2、B-> C 2ですか?明らかB、A、C食べるBを食べ、その後、AはC、A-> Cである1を食べるべきです。
A-> BはA-> Cを求める方法を、0〜1、B-> Cは?明らかにA、Bグレードは、AはC、A-> Cである1を食べるべきです。
観察を見つけることができる法則:A-> C =(A-> B + B-> C)%3。
図2に示すように、間隔マージ、値の値を更新する方法:
共通モジュロを追加する重み付け合成、VA [FX] =(S + VA [Y] -Va [X])%3。
3、どのように競合するかどうかを判断します
マイナスの影響A-> B =防ぐために(A-> C - B-> C + 3)%3は、A-> Bと当該指定された値を決定することができます
唯一の例1及び2の問題、--dのでので。
コード:
書式#include <cstdioを>
する#include <iostreamの>
の#include <アルゴリズム>
std名前空間を使用しました。
#define MAXX 1010
の#define MAXN 50010
INT FA [MAXN]、VA [MAXN]。
(int型X)を検索INT
{
IF(!X = FA [X])
{
int型T = FA [X]。
FA [X] =検索(FA [X])。
VA [X] =(VA [X] + VA [T])%3; //合并权值
}
戻りFA [X]。
}
ボイド連合(int型のx、int型のY、INT S)
{
int型FX =(X)を探します。
int型FY =(y)を見つけます。
もし(FX = FY!)
{
FA [FX] = FY。
VA [FX] = S + VA [Y] -Va [X]。
}
}
int型のmain()
{
(I ++; I <= MAXN-10 INTは、I = 0)するための
FA [I] = I。
整数N、K。
CIN >> N >> K。
int型ANS = 0;
一方、(k--)
{
int型、D、X、Y。
CIN >> D >> X >> Y。
IF((x == yの&& D == 2)|| x> N || Y> N)
ANS ++。
他
{
INT FX =(X)を検索し、FY =(y)を探します。
IF(FX ==年度)
{
IF((D-1)=(VA [X] -Va [Y] +3)%3!)
ANS ++。
}
他
{
FA [FX] = FY。
VA [FX] =((D-1)+ VA [Y] -Va [X])%3。
}
COUT << ANS << ENDL。
戻り0;}