タイトル説明
完全グラフのための 最小スパニングツリーがあり、場合にのみ 、と呼ばれる完全なグラフが 木である 広がります。
あなたのツリーを与える 見つけるために 右側と最小の完全グラフの外に拡張することができます 。
入力形式
最初の行は 、ツリー表す 点と、
次の 三つの整数の列は 、エッジ(説明)重み値を 、
入力されたデータは、ツリーを構成していることを確認してください。
出力フォーマット
完全なグラフの数のみを出力する最小表す エッジと右。
サンプル
サンプル入力
4
1 2 1
1 3 1
1 4 2
サンプル出力
12
与えられたエッジトピックは無秩序双方向側です
ツリーは昇順の境界で下に側と上で指定された場合プリム可能です
解析木なら上から、すなわちプリム可能インクリメント値の下端に各インクリメンタルステップdプリム選択されていることを確認します
WA 10分
双方向側のタイトル与えられた側は、親ノードであるかを決定することができません
入力ファイル(tree1.in)
10
5 10 1
5 4 4
4 9 6
2 9 6
8 4 6
1 5 2
3 10 9
5 7 7
6 9 3
応答ファイル(tree1.out)
319
5 4 4
8 4 6
でも、X <Yを保証
1 5 2
5 4 4
または親があるだろう、2つの点があります
だから、DFSの成果であります
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型の N = 10000 + 5 。 構造体T { int型P、D。 }。 ブール CMP(TのX、T Y){ 戻り XD < YD。} int型VIS [N]を。 TがT [N]。 INT のmain(){ int型のn年間= 0 。 cinを >> N; 以下のために(int型 i = 1 ; iがn <; iは++ ){ int型X、Y、Z。 CIN >> X >> Y Z; // IF(X> Y)= T {INT X; X = Y; Y = T;}か 年 + = Z; T [Y] .P =のX。 T [Y] .D = Z。 } ソート(T + 1、T + N + 1 、CMP)。 以下のために(int型 i = 1 ; iが++; iが<= N ){ VIS [I] = 1 。 用(INTの J = 1 ; J <= nであり、j ++ ){ 場合(!(VIS [J])&&(T [j]は.P =!I)) 年 + = T [J] .D + 1 ; } } coutの << 年。 リターン 0 ; }
WA 10分
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型の N = 10000 + 5 。 構造体T { int型の ID、P、D。 // ID }。 ブール CMP(TのX、T Y){ 戻り XD < YD。} INT VIS [N]、E [N] [N]、N。 TがT [N]。 ボイド DFS(int型 X){ // 事前プリム VIS [X] = 1 。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ 場合(!(VIS [I])&& (E [X] [I])){ T [i]は.P =のX。 T [i]は.D = E [X] [I]; T [i]は.ID = I。 DFS(I); } } } INT のmain(){ int型年= 0 。 cinを >> N; 以下のために(int型 i = 1 ; iがn <; iは++ ){ int型X、Y、Z。 CIN >> X >> Y >> Z。 年 + = Z; E [X] [Y] = E [Y] [X] = Z; } DFS(1 )。 T [ 1 ] .ID = 1 。 ソート(T + 1、T + N + 1 、CMP)。 memsetの(VIS、0、はsizeof (VIS))。 以下のために(int型 i = 1 ; iが++; iが<= N ){ VIS [T [i]は.ID] = 1。 // VIS [I] のための(INT J = 1 ; J <= nであり、j ++ ){ もし、((VIS [T [J] .ID])&&(T [j]は.P =!T [i]は。 ID)) 年 + = T [J] .D + 1 ; // ネジ[J] T [j]はIP!= I } } coutの << 年。 リターン 0 ; }
WA 10分
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型の N = 10000 + 5 。 INT VIS [N]、E [N] [N]、D [N]、P [N]、DD [N]、N、ANS = 0 。 ボイドプリム(){ // プリム事前 Dを[ 1 ] = 0 ; int型のk、分。 以下のために(int型 i = 1 ; iが++; iが<= N ){ 分 = 0x3f3f3f3f 。 用(INTの J = 1 ; J <= N; J ++ ) 場合((VIS [J])&&(分!> D [J])){分= D [j]は、K = J。 } VIS [K] = 1。// 漏了 // coutの<< K <<てendl; 用(INT J = 1 ; J <= nであり、j ++ ){ 場合(!(VIS [J])&&(D [j]が> E [k]は[J]))D [J] = E [K] [ J]; それ以外の 場合((!VIS [J])){ 年 + = DD [J] + 1 ; COUT << DD [J] + 1 << ENDL。 } } } } ボイド DFS(int型X){ VIS [X] = 1 。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ 場合(!(VIS [I])&&(E [x]は[I] = 0x3f3f3f3f)){ // E [X] [I] DD [ I] = E [X] [I]; DFS(I); } } } INT {main()の cinを >> N; memsetの(E、0x3fを、はsizeof (e)参照)。 以下のために(int型 i = 1 ; iがn <; iは++ ){ int型X、Y、Z。 CIN >> X >> Y >> Z。 年 + = Z; E [X] [Y] = E [Y] [X] = Z; } memsetの(D、0x3fを、はsizeof (d)参照)。 DFS(1 )。 memsetの(VIS、0、はsizeof (VIS))。 堅苦しい(); coutの << 年。 リターン 0 ; }