最小スパニングツリー
トピックへのリンク: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 ; }