Networking--テンプレート最小スパニングツリーの問題

トピックリンク

質問の意味:

M n点あなたが最小スパニングツリーの右端を見つけます

ソリューション:

最小スパニングツリーベアボード

 

コード:

#include <iostreamの> 
する#include <stdio.hに> 
する#include <math.h>の
書式#include <アルゴリズム> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 MAXN = 50 ;
INT [MAXN] F。
int型nは、CNT;
構造体ノード
{ 
    int型U、V、W。
    ブール 演算子 <(constのノード&A)のconst 
    { 
        リターン <W AW。
    } 
}エッジ[MAXN * MAXN]。

INT検索(int型X)
{ 
    戻り X == F [x]はx:F [X] = 検索(F [X])。
} 
INT クラスカル()
{ 
    int型 ANS = 0 以下のためにint型 I = 0 F [I] = iは++; iが<= N)I。
    int型の合計= 0 ; 
    ソート(エッジ、エッジ + CNT)。
    以下のためにint型 i = 0 ; iはCNT <I ++の
    { 
        int型のx = エッジを[I] .U。
        INT Y = エッジ[I] .V。
        int型の FX =(x)を検索。
        int型 FY = (y)を見つけます。
        もし(!FX = FY)
        { 
            F [FX] = FY。
            ANS + = エッジ[I] .W。
            合計 ++ ; 
        } 
        であれば(和== N- 1ブレーク
    } 
    戻りANS。
} 
int型のmain()
{ 
    int型、N M。
    一方、(〜のscanf(" %d個の%のD "、&​​N、&M)&& N)
    { 
        CNT =のM。
        ためにint型私= 0 ; iがn = <; iは++)F [I] = I。
        以下のためにint型 i = 0 ; iがm <; iは++ 
        { 
            int型、U、V、W。
            scanf関数(" %D%D%D "、およびuは、&​​V、およびW)
            エッジ[I] .U = U。
            エッジ[I] .V = V。
            エッジ[I] .W = W。
        } 
        のprintf(" %d個の\ n " 、クラスカル())。

    } 
    戻り 0 
}
クラスカル

 

おすすめ

転載: www.cnblogs.com/j666/p/11616873.html