kurskalアルゴリズムは、まばらなグラフに適しています
クラスカル擬似コード:
1 INT クラスカル(){ 2 、最小エッジウェイトANS、辺num_edgeの現在の数の最小スパニングツリーの和のスパニングツリーように 3。 小から大へのエッジ重量すべての側面; 4 用(小大に全てを列挙します側){ 5。 IF 通信ブロックの両端点の異なる側で(現在のテスト){ 6 試験は、最小スパニングツリーを添加する; 7 ANS = + 試験の右側の側面、 8 の最小スパニングツリーのエッジの現在の数Num_Edgeプラスワン; 9 現在の数は、頂点の数に等しいマイナスサイクルの側Num_Edge端が1であり; 10 } 11 12れる } 13は、 戻りANSを、 14 }
特定の実装:
1つの 構造体のエッジ{ 2 INT U、V; // 両側のエンドポイント番号 3 int型のコスト; // エッジ重み 4。 } E [MAXV]; 5 。6 BOOL CMP(エッジA、エッジB){ 7 戻り a.cost < b.cost; 8 } 。9 INT父[MAXV]; // 互いに素なセットアレイ 10 。11 @ 互いに素なセットクエリ機能 12は 、INT findFather(INT X){ 13は、 int型 A = X; 14 ながら(X =!父[X]){ 15 X = 父[X]; 16 } 17 18である // パス圧縮 。19 ながら!(A = 父[A]){ 20は、 INT Z = A; 21は = 父[A]、 22である 父[Z] =のX; 23である } 24 25 リターンX; 26である } 27 28 // クラスカル機能頂点パラメータnは、図のMの数のために、右側の最小スパニングツリーを返し、エッジの数 29 のintクラスカル(int型 nは、int型M){ 30 INT ANS =0、num_edge = 0 ; // エッジ重みの最小和は、スパニングの現在の数は、エッジ 31を // 初期化互いに素なセット 32 のために(INT I = 1 ; I <= N; I ++は){ 33は 父[I] = I ; 34 } 35 36 // すべての側面ソート 37 ソート(E、E + M、CMP); 38である // すべてのエッジトラバース 39を するための(int型 I = 0 ;私は<M Iは++ ){ 40 INT FAU = findFather (E [I] .U); // 2つのルートを終了エッジのクエリテストセット 41 INT FAV = findFather(E [I] .V); 42で IF(FAU =!FAV){ 43は 父[FAV] = FAU; 44である ANS + = ; E [I] .cost 45 num_edge ++ ; 46である IF(== num_edge N - 1)BREAK ; // ツリーがループから構築されている場合、 47 } 48 } 49 IF(N-num_edge =! - 1。 )リターン - 1。 ; // 図のいずれも、返さない-1 50 他の リターンANS; // そうでない場合は右側、最小スパニングツリー 51 }