問題の意味:Nスナックがあり、m個の個々のは、誰もが人の出会い2が自分の好きなおやつを持っている場合、あなたが食べることができない、下の最適な順序でスナックを食べるように求められます食べることができ、2つの好きなスナックを持っています自分の好きなおやつの数が最小数ですか?
ソリューション:n点としてスナックのn種類、M mは、個人としてエッジ食べるために最初の人の内側にそれぞれ接続されているグラフを、私たちはあなたのお気に入りのスナックの2種類を食べることができます。各時間は、このエッジは、既に図エッジの内部と連通してスナックを食べてはならない、既存の接続グラフは内部図1の通信は、軽食を食べることを確認することができた場合、統計は、CNTと食べることができ、あるか否かを判断しますスナックの数、および最終的にはM-cntが答えです
#include <iostreamの> する#include < 文字列・H> の#include < ストリング > の#include <アルゴリズム> 使用して 名前空間STD; INT P [ 1000005 ]は、R [ 1000005 ]; int型 N-、T = 0 ; 無効(INIT)を// コレクション、自分の上司の各要素を初期化する { ため(INT I = 1 ; I <= N; I ++は) { P [I] = I; } } int型の検索(INT X)//xの要素を見つけるボス { IF(x == P [X]) 戻りX; 他は 戻り Pを[X] = (Pは[X])を探す; } 無効に参加(INT X、INT Y)//の両者をマージセット { INT xRoot = (X)を検索し、 INT yRoot = (Y)を探す; IF(xRoot == yRoot)// 同じ所有者が、結合していない リターン; // 。CNT-CNT = 1; IF(R&LT [xRoot < R&LT [yRoot])// 樹高の要素iは、ルートブッシュボスツリー高いのルートノード認識されるR&LT [I] P [xRoot] = yRootと、 他 IF(R&LT [xRoot]> R&LT [yRoot]) P [yRoot] = xRoot; 他 { P [yRoot] = xRoot; // ボスツリーの高さを加えたものと同一樹高 R&LT [xRoot] ++ ; } } BOOL sameRoot(int型 X、int型 Y)を// クエリも同じボスの二つの要素 { 戻り検索(X)== (Y)を検索し; } // ここで、異なるサブセットの使用CNT番号を見つけることが、初期化CNT = N、片側の各添加、CNT-CNT = 1; int型のmain() { (IOSの:: sync_with_stdio はfalse ); int型 M、CNT = 0 。 CIN >> N >> M。 初期化(); 以下のために(int型 i = 0 ; iがm <; iは++ ) { int型X、Y。 CIN >> X >> Y。 もし(!sameRoot(X、Y)) { (x、y)を参加します。 CNT ++ ; } } COUT << M-CNT << ENDL。 リターン 0 ; }