この問題を解決するための最小全域木ボードとプリム

// HDU 1863
書式#include <cstdioを>
書式#include <CStringの>

const int型INF = 0x3f3f3f3f。

N INT、M。
INT G [105] [105]。

ブールread_input(){
    (!のscanf( "%d個の%d個"、&nは、&M)== 2 && n)の場合はfalseを返します。
    memsetの(G、INF、はsizeof(G))。
    U、V、E int型。
    {(;; I = N!++ iが0 = INT)について
        scanf関数( "%D%D%D"、およびuは、&V、&E)。
        IF(E <G [U] [V]){
            G [U] [V] = G [V] [U] = E。
        }
    }
    trueを返します。
}

INT [105]を言います。
INT力[105]。
{プリムボイド()
    int型の合計= 0;
    int型CNT = 1;
    {(; I <= M ++ iは1 = INT)のために
        DIS [I] = G [1]〜[I]。
        [I] = 0図です。
    }
    VIS [1] = 1。
    以下のために(INT i = 0;!I = M-1; ++ I){
        = INFからあなた。
        int型トン= 1000;
        (INT J = 1; J <= M; ++ j)のための{
            (もし!VIS [J] && DIS [J] <ミネソタ州){
                DISによる= [J]。
                T = J;
            }
        }
        もし(T == 1000)休憩。
        合計+ =ミネソタ州。
        力[I] = 1。
        CNT ++;
        (INT J = 1; J <= M; ++ j)のための{
            IF(!VIS [J] && DIS [J]> G [t]は[J]){
                伝える[J] = G [t]は[J]。
            }
        }
    }
    IF(CNT == M)のprintf( "%d個の\ n"、合計)。
    他のprintf( "\ nは?");
}

{int型のmain()
    一方、(read_input()){
        堅苦しい();
    }
    0を返します。
}

おすすめ

転載: www.cnblogs.com/pupil-xj/p/11564218.html