原則:貪欲なアルゴリズムを使用します。まずエッジの昇順に重量に応じて、初期点のそれぞれは、木(ツリーノード)です。最小スパニングツリーに私達の既に集電体の前縁、現在のエッジの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; }