羅区P1137(ツリー最長の道路の各点、DP)

タイトル説明

全国ツアーに行く暁明。国が#ありN Nの都市を、番号が1 に1をN 、N、とあるM 接続M道路、暁明は、都市のひとつから出発して、私だけが停止東街を行く準備ができて。

そこで彼は、到着する最初の都市を選択するようにし、また訪問したい行の行の前にある都市のすべての都市の東、最初の都市に加えように、この前提を満たすために、私が最後である都市へのルートを開発する必要がありますできるだけ多くの都市。

さて、あなただけのすべての道路が接続されている2つの都市間の相対的な位置関係を知っているが、すべての都市の特定の場所を知りません。これで、すべてのために私は、あなたが暁明のためのコースを開発するために、そして街見つける必要があり、私は私が見学することができますどのように多くの都市までで終了します。

入力形式

最初の1 。1つの行為2つの正の整数N、M N M。

次のM M行は、2つの正の整数の各行Y、X、X- Yは、接続都市があることを示すX- X-都市Y 道路yは、都市を保証するためにX- X-都市Y Y西。

出力フォーマット

N Nライン、I I線は正の整数が含まれ、それが最初に発現I 都市の最大数の終わりのI都市ツアーができます。

サンプル入力と出力

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

説明/ヒント

これらの答えの全てが出発1の都市から入手することができます選択します。

以下のための20 \%2 0 データの%、N≤100 N 1。0 0。

以下のための60 \%6。0 データの%、N≤1000年N 1。0 0 0。

以下のための100 \%。1 0 0 %データ、N≤100000、200000 M≤ N 。1 0 0 0 0 0 M 2 0 0 0 0 0。

 

リバース図のデポジットが、その後の質問は、i番目の点から変換となり、最大距離はすべて行きます

DP [i]は効率が非常に高く、行くことができる縁を通る最大距離i番目、このプルーニング利点を示しています。各ポイントのDFS答えを求めながら、

コード:

<ビット/ STDC ++ H>の#include
 の#defineデバッグ(X)COUT << "[" << #X << ":" <<(X)<< "]" << ENDL
 の#define PII対<整数、整数>
 の#define CLR(B)のmemset((A)、B、はsizeof(A))
 の#define担当者(I、B)(iは= int型、iがBを<; I ++の)のため
 の#define PB一back
 の#define MPはmake_pair
 の#defineが長い長いLL
 の#defineが符号なしLLのULL
 の#define I << 1個のLS
 の#define RS(iは<< 1)+ 1
 の#define第Fiの
 に#define SE第二
 の#define PTCHのputchar
 の#define CLRを( a)は(!(A).empty())は、A。ポップ() 使用して名前空間はstdを、

 
インラインLLリード(){ 
    LL S = 0、W = 1 チャー CH = GETCHAR()。
    一方、(!isdigit(CH)){
         場合(CH == ' - ' = W) - 1 
        CH = GETCHAR()。
    } 
    一方(isdigit(CH))
        S = sの* 10 + CH - ' 0 '、CH = GETCHAR()。
    リターンの* ワット。
} 
インラインボイドライト(LLのX){
     場合(X <0 
        のputchar(' - ')、X = - X。
    もし(X> 9 
        、書き込み(X / 10 )。
    putchar(Xの10 + ' 0 ' )。
} 

のconst  int型 MAXN = 1E5 + 10 int型のヘッド[MAXN]、CNT;
構造体XX {
     int型V、NEX。
    (XX INT V = 0INT NEX = 0 ):
        V(V)、NEX(NEX){} 
}エッジ[MAXN<< 1 ]。
INT DP [MAXN << 1 ]。

INT DFS(INT P、INT F){
     int型 ANS = 0 以下のためにint型 ;〜I I = I =ヘッド[P] {エッジ[I] .nex)
         のint V = エッジ[I] .V。
        もし(vは== f)を続けますもし(!DP [i])とDP [I] = DFS(V、P)+ 1 
        ANS = MAX(ANS、DP [I])。
    } 
    戻りANS。
} 

int型{メイン()
 //#ifndefのONLINE_JUDGE
 //     freopenは( "in.txt"、 "R"、STDIN)。
//     freopenは( "out.txtを"、 "W"、STDOUT)。
// #endifの
    整数 N =)(読み取り、M = read()は、
    CLR(ヘッド、 - 1)。CNT = 0 ;
    以下のためにint型 iは= 1 ; I <= M; ++ i)は{
         int型、U =読み取る()、V = (読み取り)
        エッジ[CNT] =のXX(U、ヘッド[V])。
        ヘッド[V] = CNT ++ 
    } 
    のためのint型 I = 1 ; ++; iが<= N  I)
        ライト(DFS(I、- 1)+ 1)、PTCH(' の\ n ' );
    リターン 0 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/rookie-acmer/p/11354464.html