(* ^ - ^ *)こんにゃくの問題解決を指して希望のギャングスター(* ^ __ ^ *)
私は個人的にこの質問はクラスカルのアルゴリズムは、テンプレートのタイトルだと思い非常に簡単です。
クラスカル(クラスカル):最小スパニングツリーアルゴリズムに独創的な互いに素なセットを使用。
実装プロセス:
次のようにプロセスは以下のとおりです。
- 初期化は、互いに素なセット、自身の親ノードの各点を初期化します。
- ゼロにカウンター。
- 大速い行に小さな値の全て右端。
- 具体的なクラスカル法:
1 ためには、(int型、I = 1 ; I <= M; iが++ ) 2 { 3 int型 = =(E [I] .X)、F2検索F1 (E [I] .Y)を探します。 4 もし(!F1 = F2) 5 { 6つの ANS = MAX(ANS、E [I] .DIS)。 7つの FA [F1 = F2。 8 もし(K == N- 1)ブレーク。 9 K ++ 。 10 } 11 }
以下の完全なコード(Diudiu aをコメント)
コード
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; int型 N-、M、ANS、K = 1、FA [ 100005 ]; 構造体ノード// エッジ構造によって表される { int型のX、Y、DIS; } E [ 100005 ]; BOOL CMP(ノードX、ノードY) { 戻り <x.dis y.dis; } int型検索(INT X)// Xの祖先を見つける { IF FA [X] =(FA [x]はxを=!)検索(FA [X]); を返すFA [X]; } 無効連合(int型 X、int型Y)// 将X、Y并为一个集合 { 場合 =((X見つける。)!検索(Y)) FA [(X)検索] = (y)を探します。 } int型のmain() { CIN >> N >> M。 以下のために(int型 i = 1 ; iが<= N; iは++ ) FA [I] = I。 以下のために(int型 I = 1 ; I <= M Iは++ ) CIN >> E [I] .X >> E [I] .Y >> E [I] .DIS。 ソート(E + 1、E + M + 1、CMP)。// 快排 用(INT I = 1 ; Iは<= M、Iが++ ) { int型 F1を検索(E [I]が.X)、F2 = = ;検索(E [I]が.Y) IF!(F1 = F2)// もし異なる父親 { ANS = MAX(ANS、E [I] .DIS); // 更新回答 FA [F1 = F2; IF(K == N- 1)BREAK ; // 少なくとも側面は点-1接続 ; ++ Kを// カウンター++ } } COUT << ANS <<てendl; // 出力 リターン 0 ; }