Roads--最小スパニングツリーの構築

トピックリンク

 

質問の意味:

1からNまでの番号Nの村があり、Nは現在の村の道路との間に必要とされるので、通信は、任意の2つの村の間とすることができます。、A、Bは、2つの村の通信であることを特徴と

AとBとが直接道路、存在または村Cが接続されており、場合だけようにAとCの間に2つの村を結ぶ道路、及びCとBパスの間に接続があります。

いくつかの村の間で知られているように、直接接続、すべての村が接続されるようにテスト経路の一部の構成、及び最短道路の全長。

 

マトリックス内の2つの与えられた点の間の距離と二行二つの経路を示し、各頁の所定数は、村を修理されました

ソリューション:

最低限のスパニングツリー・ボード

限り道路が建設されているように、右値は0に設定されています

 

コード:

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

INT検索(int型X)
{ 
    戻り X == F [x]はx:F [X] = 検索(F [X])。
} 
ボイド追加(INT U、INT V、INT W)
{ 
    エッジ[CNT] .U = U。
    エッジ[CNT] .V = V。
    エッジ[CNT。++]、W = W。
} 

INT クラスカル()
{ 
    int型 ANS = 0 以下のためにint型 I = 0 F [I] = iは++; iが<= N)I。
    ソート(エッジ、エッジ + CNT)。
    int型の合計=0 ;
    以下のために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()
{ 

    ながら(〜のscanf(" %d個"、&​​N)&& N)
    { 
        ためint型 i = 1 ; iが<= N; I ++)のためのINT J = 1 ; J <= N; J ++ 
        { 
            int型のX; 
            scanf関数(" %のD "、&x)は、
            追加(I、J、X); 
        } 
        int型Q; 
        scanf関数(" %のD "、&Q)。
        以下のためのint型 I = 1; I <= Q; iが++ 
        { 
            int型、B。
            scanf関数(" %D%dの"、&​​、&B)。
            追加(A、B、0 ); 
        } 
        のprintf(" %d個の\ n " 、クラスカル())。

    } 
    戻り 0 
}
クラスカル

 

おすすめ

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