テンプレートフレームワークのツリー、グラフの深さ優先探索

書式#include <iostreamの>

名前空間stdを使用。

INT N = 1E5 + 10、M = N * 2。

// hが、Eがすべてのエッジに格納されているリストの先頭を表し、NEはすべての数がnの単一のリンクされたリストに対応する次のポインタである表し
int型H [N]と[M]、NE [M]、IDX。

//深さ優先探索と幅優先探索は一度だけ、各点を横切ります
ブール値ST [N]; //これらの点でセーブが終わるトラバースされており、彼が行き来する必要はありません

無効アドオン(int型A、INT B){//フロント挿入B
    E [IDX] = B。
    NE [IDX] = hの[A]。
    H [A] = IDX ++。
}

//コードの時間の複雑さと深さ優先探索木グラフはO(N + M)であり、点や線状などの縁
// Uは、それがのノードを通過したことを言いました
DFSあなた(とあなた){
    ST [U]は真=、現在の点まで//最初のマーカーで検索されました
    
    U下のすべての初期および境界//反復
    {(; I = -1!私は、NEを= [I] I = Hを[U] INT)のために
        //ノード番号内部電流マップはノード番号で保存
        int型J = E [i]は、
        //現在のポイントが行われていない場合は、それが発見された、道路は黒行きます
        (!ST [J])DFS(j)の場合。
        
    }
}

{int型のmain()
    -1 //第1のノード点、ポイントの単一のリストにヘッドノードN-
    memsetの(H、-1、はsizeofのH)。
    
    DFS(1); //最初のポイントから検索を開始します
}

  例:

846木の重心

ツリーが与えられると、ツリーは、n個のノード(番号1〜n)であり、n-1無向エッジを含みます。

ツリーの重心を見つけ、そして、残りの各ブロックの通信ポイントを削除重心の後に最大値を出力してください。

重心が定義されている。この点を削除する場合に重心が、ツリー内のノードであり、通信の残りのブロックのそれぞれの点の最大数は、ツリーの重心はノードと呼ばれ、最小です。

入力形式

最初の行は、整数n、ツリー内のノードの数を含んでいます。

次に、N-1行、二つの整数A及びBを含む各行は、点AとエッジBとの間で表しています。

出力フォーマット

出力ノード整数mの数は、サブツリーの全て最大サブツリーの重心を表します。

データ範囲

1 N 10 5 1≤n≤105

サンプル入力

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

出力例:

4

書式#include <iostreamの>
書式#include <アルゴリズム>
書式#include <CStringの>

名前空間stdを使用。

CONST int型N = 1E5 + 10、M = N * 2。

// hが、Eがすべてのエッジに格納されているリストの先頭を表し、NEはすべての数がnの単一のリンクされたリストに対応する次のポインタである表し
INT H [N]と[M]、NE [M]、IDX、N。

int型ANS = N;最大記憶回答の//グローバル最小

//深さ優先探索と幅優先探索は一度だけ、各点を横切ります
ブール値ST [N]; //これらの点でセーブが終わるトラバースされており、彼が行き来する必要はありません

無効アドオン(int型A、INT B){//フロント挿入B
    E [IDX] = B。
    NE [IDX] = hの[A]。
    H [A] = IDX ++。
}

//コードの時間の複雑さと深さ優先探索木グラフはO(N + M)であり、点や線状などの縁
// Uは、それがのノードを通過したことを言いました
U //サブツリーの数が中間点で根付い
DFSあなた(とあなた){
    ST [U]は真=、現在の点まで//最初のマーカーで検索されました
    
    //現在のサブツリーの大きさを記録
    int型の合計= 1;
    INT RES = 0; //現在の通信は、最大ブロックの最小値であります
    
    U下のすべての初期および境界//反復
    {(; I = -1!私は、NEを= [I] I = Hを[U] INT)のために
        //ノード番号内部電流マップはノード番号で保存
        int型J = E [i]は、
        //現在のポイントが行われていない場合は、それが発見された、道路は黒行きます
        (もし!ST [J]){
            
            //現在のサブツリーの大きさを表し、
            int型S =のDFS(J)。
            
            //現在のサブツリーは、通信ブロックと考えることができます
            RES = MAX(RES、S)。
            //木は私たちの子供たちの現在のサブツリーの一部であります
            // sがUの一部​​であることはサブツリーのルートであるサブツリーのルートであります
            合計+ = S;
        }
    }
    
    RES = MAX(RES、N  - 合計)。
    
    // coutの<< U << "" <<合計。
    
    最終解像度//現在のストアを削除した後のポイントの最大数は、この時点まで記憶されています
    年=分(RES、年);
    
    合計を返します。
}

{int型のmain()
    -1 //第1のノード点、ポイントの単一のリストにヘッドノードN-
    memsetの(H、-1、はsizeofのH)。
    
    cinを>> N;
    
    {;  - ;(I ++は1をiがN <I = 0 INT)のために
        、B int型。
        CIN >> A >> B;
        (a、b)は、追加(B、A)。
    }
    
    DFS(1); //最初のポイントから検索を開始します
    
    coutの<<年。
}

  

おすすめ

転載: www.cnblogs.com/luyuan-chen/p/11717545.html