最小スパニングツリーアルゴリズムは、クラスカルを生成し、

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 - 1BREAK ;     // ツリーがループから構築されている場合、
47          }
 48      }
 49      IF(N-num_edge =! - 1。 リターン - 1。 ;         // 図のいずれも、返さない-1 
50      他の リターンANS;         // そうでない場合は右側、最小スパニングツリー
51 }

 

おすすめ

転載: www.cnblogs.com/hi3254014978/p/11497610.html