POJ-グラフ理論 - 最小スパニングツリーのテンプレート

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 ;
}
オーバーロードのエッジに劣りません

おすすめ

転載: www.cnblogs.com/yun-an/p/11111934.html