LOJ10067完全グラフ構造

タイトル説明

完全グラフのための  最小スパニングツリーがあり、場合にのみ  、と呼ばれる完全なグラフが   木である   広がります。

あなたのツリーを与える  見つけるために   右側と最小の完全グラフの外に拡張することができます 

入力形式

最初の行は   、ツリー表す   点と、

次の   三つの整数の列は  、エッジ(説明)重み値を 

入力されたデータは、ツリーを構成していることを確認してください。

出力フォーマット

完全なグラフの数のみを出力する最小表す   エッジと右。

サンプル

サンプル入力

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 ;
    } 

 

おすすめ

転載: www.cnblogs.com/wyh447154317/p/11665468.html