KruscalアルゴリズムはC ++で実装しました

 

原則:貪欲なアルゴリズムを使用します。まずエッジの昇順に重量に応じて、初期点のそれぞれは、木(ツリーノード)です。最小スパニングツリーに私達の既に集電体の前縁、現在のエッジのXY、Xであれば、Yを通過した後、このエッジをスキップします。

X場合はスパニングツリー最小、およびXが含まれており、yは木を備えるツリーにマージされているツリーを追加しながら、yは、私たちにスパニングツリー少なくとも最小を持っていません。(差動作が完了する複合セットを使用して)

注意:コードが正しいかどうかを検証しません!

// Kruscal算法2020年3月29日午後9時41分19秒

// --------------------------------- - 

ベクトル < int型 >父。// 并差集

空隙マージ(int型のx、int型のY){
     int型 x_father = get_father(X)、y_father = get_father(Y)。
    父[X] = y_father。
} 

INT get_father(INT X){
     場合(!父[X] = X){
         戻り父[X] = get_father(父[X])。
    } 
    戻りX。
} 
// -----------------------------------
構造体のエッジ      // 右側
{
     int型にPoint1;
     int型ポイント2;
     int型計量; 
    エッジ(int型 X、INT Y、INT Z)にPoint1(X)、ポイント2(Y)、計量(Z){} 
}; 

// - ---------------------------------- 

// 無向グラフとMST加重右端見つける
int型kruscalを( ){
     int型ポイント; // 点:点 
    COUT << " 入力ポイントの数:" << ENDL; 
    CIN >> 点; 
    father.resize(点)
    のためのINT= I 0、I <ポイント; ++ I){ 
        父[I] = I; 
    } 
    ベクトル <エッジ>エッジ;     // エッジ:設定の右側
    のint R&LT、S、T;
     ながら(R&LT CIN >>> > S >> T){ 
        edges.emplace_back(R&LT、S、T); 
    } 
    ソート(edges.begin()、edges.end()、[](CONSTエッジA&、constのエッジ&B){ リターン a.weigh < b.weigh;});    // 大重量の小に応じて
    int型 RES;     // 右及びMST 
    INT edge_cnt = 0 ;      //は、辺の数を選択した
    ためCONSTオート・エッジ:エッジ){
         int型 P1 = edge.point1、P2 = edge.point2;
         IF(父[P1] ==父[P2]){ // P1、P2は、MSTが参加している
            続行; 
        } 
        RES + =エッジ。計量; // これはMSTが付加されている 
        ++ edge_cnt、
        マージ(P1、P2); // 2つの点をマージ
        IF(edge_cnt> = points- 1。){ // エッジ数が-1点、MSTを完成
            BREAK ; 
        } 
    } 
    戻りRES; 
}

 

おすすめ

転載: www.cnblogs.com/FdWzy/p/12595136.html