POJ-グラフ理論 - 最小スパニングツリーのテンプレート
クラスカル法
1.孤立の初期セットに属するすべてのノード。
場合昇順2.トラバースすべての右側エッジは、エッジの頂点にトラバースがまだ二つの異なるサブセット属(最小重量片セットの両側に連通している側)端と判定されましたこれは、エッジ上の最小スパニングツリーであり、頂点の2つの合成セットが属しています。
3.すべての側面を横断し、すべてのノードが選択された元のエッジ上の同じセットとスパニングツリー元の最小値を構成するすべてのノードに属している、そうでなければ画像は通信しない、最小スパニングツリーは存在しません。
データ構造:導入エッジ構造、及びオペレータのオーバーロードの数よりも少ないです
構造体のエッジ { INT A、B; // 接合側のIDを横切って int型のコスト; // エッジ重み BOOLの 演算子 <(CONSTエッジA&)CONST { 戻りコスト<A.cost; // 昇順にエッジ重み } }エッジ[ 6000 ]。
それは互いに素設定操作のセットで実装されています
無効のinit() { 以下のために(int型 i = 1 ; iが<= N; iは++)Pは[I] = I。 年 = 0 ; } int型の検索(int型x)は、 { リターン(x == P [X])?X:P [X] = (pは、[X])を見つけます。 } ボイド連合(INT I)// 側のパッキングユニットとして { INT A = (エッジ[I] II.A)を探す; int型 B =(エッジ[I] .B)を探す; //は、2つの頂点のエッジのセットを探します情報 IF(!= B)// それらは異なるセットに属している場合、エッジの選択 { P [B] =; // 複合セット ANS =エッジ+ [I] .cost; // 累積重み値 } }
例5.3 または平滑プロジェクト
書式#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間はstdを、 CONSTの INT N = 101 。 INT P [N]; // ノードの親グループは、 int型 ; N- // ノードの数が int型 ANSを; // 最小重量と 構造体のエッジ { INT A、B; // 接合側IDを横切って int型のコスト; // エッジ重み }エッジ[ 6000 ]。 ブールCMP(エッジA、エッジB) { 返す a.cost < b.cost。 } 無効のinit() { 以下のために(int型 i = 1 ; iが<= N; iは++)Pは[I] = I。 年 = 0 ; } int型の検索(int型x)は、 { リターン(x == P [X])?X:P [X] = (pは、[X])を見つけます。 } ボイド連合(INT I)// 側のパッキングユニットとして { INT A = (エッジ[I] II.A)を探す; int型 B =(エッジ[I] .B)を探す; //は、2つの頂点のエッジのセットを探します情報 IF(!= B)// それらは異なるセットに属している場合、エッジの選択 { P [B] =; // 複合セット ANS =エッジ+ [I] .cost; // 累積重み値 } } int型のmain() { しばらく(scanf関数(" %d個"、&N)!= EOF && N!= 0 ) { 用(int型 iは= 1 - ; iが= N *(N < 1)/ 2のscanf(; I ++)は、 " %D%D%D "、およびエッジ[I] .A、&エッジ[I] .B、&エッジ[ i]の.cost)。 ソート(エッジ + 1、エッジ+ 1 + * N-(N - 1)/ 2、CMP); // エッジの要素を起動する[1]、N *の合計(N - 1)/ 2 の要素を並べ替え、保留中 のinit( ); のため(int型 I = 1。 ; I <= N *(N - 1。)/ 2 ; I ++の)連合(I)の; printf(" %d個の\ n " 、ANS)。 } リターン 0 ; }
書式#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間はstdを、 CONSTの INT N = 101 。 INT P [N]; // ノードの親グループは、 int型 ; N- // ノードの数が int型 ANSを; // 最小重量と 構造体のエッジ { INT A、B; // 接合側のIDを横切って int型のコスト; // エッジ重み BOOLの 演算子 <(CONSTエッジA&)CONST { 戻りコスト<A.cost; // 昇順にエッジ重み } }エッジ[ 6000 ]。 無効のinit() { 以下のために(int型 i = 1 ; iが<= N; iは++)Pは[I] = I。 年 = 0 ; } int型の検索(int型x)は、 { リターン(x == P [X])?X:P [X] = (pは、[X])を見つけます。 } ボイド連合(INT I)// 側のパッキングユニットとして { INT A = (エッジ[I] II.A)を探す; int型 B =(エッジ[I] .B)を探す; //は、2つの頂点のエッジのセットを探します情報 IF(!= B)// それらは異なるセットに属している場合、エッジの選択 { P [B] =; // 複合セット ANS =エッジ+ [I] .cost; // 累積重み値 } } int型のmain() { しばらく(scanf関数(" %d個"、&N)!= EOF && N!= 0 ) { 用(int型 iは= 1 - ; iが= N *(N < 1)/ 2のscanf(; I ++)は、 " %D%D%D "、およびエッジ[I] .A、&エッジ[I] .B、&エッジ[ i]の.cost)。 ソート(エッジ + 1、エッジ+ 1 + * N-(N - 1)/ 2); // エッジの要素を起動する[1]、N *の合計(N - 1)/ 2 注文保留中の要素 のinit()を; 以下のための(int型 I = 1。 ; I <= N *(N - 1。)/ 2 ; I ++の)連合(I)の; printf(" %d個の\ n " 、ANS)。 } リターン 0 ; }