互いに素なセットの例02.加重互いに素なセット(poj1182)

説明

動物界のAの動物の3種類があり、Bは、Cは、動物の食物連鎖の3つのタイプが面白い環を構成します。食品B、BはAを食べるC、Cを食べます
動物の前N、1-Nの数。各動物は親切でA、B、Cであるが、我々は最終的にはそれを知らないどのような種類のです。
:これは、N説明から成るこの栄養動物の2つのバージョンを用いて行った
、最初の引数が「1 X Y」であるXを表し、Yは類似しています。
2番目の引数が「2 X Y」であり、Xは食べる表しY.
上記の二つの文、文によって、一つの文章とNの動物のためのこの人は、この文いくつかの真の、いくつかの偽のK、Kを避けます。以下の三つの言葉の一つ、この文は嘘である場合には、真実はそうです。
現在の真の場合1)、次いで前の競合のいくつかは、嘘である;
2)、次いで、現在のXまたはYがNよりも大きい場合、嘘である;
3)Xが食べる表し、現在のXは、嘘です。
ジョブは、N(1 <= N <=に従って与えられ 50,000) とKワード(0 <= K <=10万 )、 出力嘘の総数。

入力

二つの整数N及びKの最初の行は、空白で区切られました。
Kザは、3行以下、各Dは、引数の型を示す二つの数字の間のスペースで区切られた正の整数D、X、Y、です。
D = 1の場合は、XとYが類似していることを示しています。
D = 2の場合、Xは食べる表しY.

出力

唯一の嘘の数を表す1つの整数。

サンプル入力

100 7 
1 101 1 
2 1 2 
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5

サンプル出力

3

アイデア:

  この質問は、古典的な例加重互いに素セット、動物との相対関係で、3つの可能性があります。同じことは、食べて、食べられています

  次に、親ノードIを表す事前[I]、[]アレイ事前の構成ながら、] [配列関係を作成することができます。関係[I] = 0及びiは事前を表す[I]と同じで、iは1が予め食べる表す= [I] = 2は、事前を表す[I] I食べます。

 

  パス圧縮:(機能を見つける)、我々は重み(関係を対応する値)を直接蓄積されていない見つけることができますが、法律がA-> C =(A-> B + B-> C)%3見つけることができますし、これにより、積算値の関係を更新するモジュロ3が必要です。次のように検索機能は次のとおりです。

1件の int型の検索(INT X){
 2      であれば(X =![X] PRE){
 3          int型 PX = ([X]を事前)を見つけます。
4          関係[X] =(関係[X] +関係[プレ[X]])%3 5          プレ[X] = PX。
6      }
 7      戻りプレ[X]。
8 }

  マージプロセスとしては、それが上記の法則から見ることができますが、との連結ベースの重量一般的にばらばらのセットを法

一般やアイデアを組み合わせたセットをチェックする権利を持ちます。

------>

 

1  であれば(FX =!年度){
 2      プリ[FX] = FY。
3      値[FX] =裁判官+値[Y] - 値[X]
 4 }

 

次のように全体的に、C言語のコードは次のとおりです。

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3  の#define MAXN 50010
 4  INT 関係[MAXN]、あらかじめ[MAXN]。
5  // 関係[I] = 0:私は吃予め[i]が2:プレ[i]は吃I iは同类1 [i]が为事前与
6  
7  ボイドのinit(){
 8      のためのINT iは= 0 ;私<MAXN; I ++ ){
 9          関係[I] = 0 ;
10          プレ[I] = I。
11      }
 12  }
 13  
14  int型の検索(INTX){
 15      であれば(X =!事前[X]){
 16          INT PX = )(PRE [X]を見つけます。
17          関係[X] =(関係[X] +関係[プレ[X]])%3 18          プレ[X] = PX。
19      }
 20      リターンプレ[X]。
21  }
 22  
23  int型 jion(int型のx、int型の Y、int型の裁判官){
 24      、INT FX = (X)を見つけます。
25      INT FY = (y)を見つけます。
26      であれば(FX == 年度){
27          であれば((関係[X] -関係[Y] + 3)%3!=裁判官)    リターン 1 28          他の    リターン 0 ;
29      }
 30      {
 31          プレ[FX] = FY。
32          関係[FX] =(関係[Y] +裁判官-関係[X] + 3)%3 33      }
 34      リターン 0 35  }
 36  
37  INT メイン(){
 38      INT N、K、X、Y、裁判官、ANS = 0;
39      のscanf(" %D%D "、&​​N&K)。
40      のinit();
41      のためにINT iは= 0 ; I <K I ++ ){
 42          のscanf(" %D%D%D "、及び裁判官、およびX&Y)。
43          であれば(X> N || Y> N ||(x == yの&&裁判官== 2 )){
 44の              ANS ++ 45は             続けます46          }
 47          であれば(jion(X、Y、judge- 1 )){
 48の              ANS ++;
49          }
 50      }
 51      のprintf(" %dの\ n " 、ANS)。
52      リターン 0 53 }

 

おすすめ

転載: www.cnblogs.com/y2ek/p/12654234.html