タイトル説明
私は敵ではない友人のことを知っている任意の二人、ここで、n人の都市に住んでいた、だけでなく、満たすために:
1、私の友人の友人は私の友人です。
2、私の敵の敵は私の友人です。
すべては、ギャングの人々の友人です。あなたの2人、2人または特定の敵の友人がある個人に関する情報の、このn個のm個を知らせる、あなたはギャングを有することができる都市の最大数を計算するプログラムを書くのか?
入力形式
最初の行nおよびmは、1 <N <1000,1≤m≤100000。
m行は、各行動P、X、Y、pは0または1であり、pは0であり、XおよびYは、友人で表されており、pはxとyが敵で表され、1です。
出力フォーマット
n個の個体を表す整数は、いくつかのギャングまで有していてもよいです。
サンプル入力
6 4
1 1 4
0 3 5
0 4 6
1 1 2
サンプル出力
3
問題の解決策
入力は、二人の友人の間であれば、それは、合併を指揮でしょう。残念ながら最初に保存するそれ以外の場合は、我々はできません、入力が完了し、その後、すべての人にすべての敵をマージします。
書式#include <iostreamの> の#include <cstdioを> に#define MAX_N 1000年 の#define MAX_M 100000 使用して名前空間はstdを、int型のn; int型メートル。 int型 H [MAX_N + 5 ]、P [MAX_M + MAX_M + 5 ]、T [MAX_M + MAX_M + 5 ]。 INTの R [MAX_N + 5 ]。 int型の C [MAX_N + 5 ]。 int型ANS; INTルート(INT X) { int型 R = X、TMP。 一方、(R = R [R]!)R = R [R]。 同時に (!X = R [X])TMP = R [X]、R [x]はR、X = = TMPと、 返すRを。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 用(登録をint i = 1 ; iが<= N; ++ I) { R [I] = I。 } int型のF、X、Y。 用(登録をint i = 1 ; I <= M + I) { scanf関数(" %D%D%D "、&F&X&Y)。 もし(F) { Tの[I] { = Y。 P [I] =をH [X]。 H [X] = I。 T [iが =のM +] Xと、 P [iが Mを+] =をH [Y]。 H [Y] = I +は、Mと、 } 他 { 場合(ルート(X)=!ルート(Y)) { R [ルート(Y)〕 = ルート(X) } } } ため(登録をint i = 1 ; iが<= N; ++ I) xは = T [H [I]]。 用(登録INT J = H [i]は、J; J = P [J]) { 場合(!ルート(X)= ルート(T [J])) { R [ルート(T [j]を)〕 = ルート(バツ); } } } ため(登録をint i = 1 ; iが<= N ++ I) { C [ルート(i)は] = 1 ; } ため(登録をint i = 1 ; iが<= N; ++ I) { ANS + =C [i]は、 } のprintf(" %dの" 、ANS)。 リターン 0 ; }