羅区、問題の最小スパニングツリーP3366 [テンプレート]

最小スパニングツリー

トピックへのリンク:https://www.luogu.org/problem/P3366

タイトル説明

この図が接続されていない場合には、無向グラフが与えられると、最小スパニングツリーは、出力ORZが得られた場合

入力形式

最初の行は、N、M、Nは総図ノードとM無向エッジを表す2つの整数を含んでいます。(N <= 5000、M <= 200000)

次のMラインが三つの整数Xiの、李、紫が含まれ、紫いいえ西、李のノードに接続されたエッジの長さを表現しました

出力フォーマット

出力の数、すなわち、最小スパニングツリーと各辺の長さを含む、出力が接続されてORZ図れていない場合。

サンプル入力と出力

入力#1
4 5 
1 2 2 
1 3 2 
1 4 3 
2 3 4 
3 4 3
出力#1
7

説明/ヒント

時間の制約:1000ミリ秒、128M

データスケール:

N <= 5、M <= 20:データの20%を

N <= 50、M <= 2500:データの40%を

N <= 500、M <= 10000:データの70%を

N <= 5000、M <= 200000:データの100%に

サンプルは説明しました:

したがって、2 + 2 + 3 = 7の総エッジ重みの最小全域木。

アイデア:シンプルなテンプレート最小スパニングツリーの問題

// 
// 2019年7月28日にHYによって作成されます。
//
する#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include < 設定 >
 使用して 名前空間はstd; 
typedefの長い 長いLL。
const  int型 MAXN = 2E5 + 10 
父[MAXN] LL。
LL N、ANS、点、M。
構造体ノード{
     int型U、V、W。
    ブール 演算子 <(CONSTノード他)CONST{
         戻り これを - > <W other.w。
    } 
}ノード[MAXN]。
(LLのX)を見つけるllの
{ 
    場合(X == 父[X])
         戻りX。
    戻り [X] =父を見つける(父[X])。
} 
ボイドKRU()
{ 
    ソート(ノード、ノード + M)。
    以下のためにint型 i = 0 ; iがm <I ++の
    { 
        int型 UU = 見つける(ノード[I] .U)を、
        INT VV = (ノード[I] .V)を見つけます。
        もし(UU == VV)
             継続;
        
        { 
            父[UU] = VV。
            ANS + = ノード[i]は.W。
            ポイント ++ ;
            もし(ポイント== N- 1 ブレーク
        } 

    } 
} 
int型のmain()
{ 
    scanf関数(" %のLLDの%のLLD "、&​​N、&M)。
    以下のためにint型 i = 0 ; iが<= N; iは++ 
        父を[I] = I。
    以下のためのint型 I = 0; iは<M; iが++ 
        のscanf(" %LLD%LLD%LLD "、およびノード[i]は.U、およびノード[I] .V、およびノード[I] .W)。
    ANS = 0、点= 0 
    KRU(); 
    printf(" %のLLD " 、ANS)。
    もし(!ポイント= N- 1 
        のprintf(" ORZ " );
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11260810.html