#(ツリー規制を動かす)羅区P3174 [HAOI2009]キャタピラ(地方の選挙/ NOi-)

タイトル説明

木のために、我々は鎖とアウトに接続されているストランド側は毛虫、より多くのポイント、より大きな芋虫のようなルックスに入って来ることができます。右側の部分を抽出木左図(図1)は、キャタピラとなるような(図2)。

入力形式

二つの整数worm.inテキストファイルの最初の行でN、M、それぞれ、エッジの数、ツリー内のノードの数、木。

次のM行は、各列二つの整数は、B点を表し、AおよびBは、エッジ(、Bの≤n)を接続しています。あなたは、同一のペアは(a、b)が複数回表示されていることを前提とすることはできません。

出力フォーマット

整数はworm.outでテキストファイルに書き込まれ、それが最大の毛虫の大きさを表しています。

サンプル入力と出力

入力#1
12 13 
1 2 
1 5 
1 6 
3 2 
4 2 
5 7 
5 8 
7 9 
7 10 
7 11 
8 12 
8 13
出力#1
11

説明/ヒント

データの40%、N≤50000

データの100%、N≤300000

分析:

チェーンの長さとチェーンのサブストランドの数と最大を満たすためにチェーンを見つけるためにあなたの木、木を与えると同等!

I [i]は、CアレイストレージノードI [i]は[I] = CのF任意のノードに対して、サブチェーンの最大数にノードjから[I] [j]は、ノードの次数を表すFを設定します

ノードiについて、その息子:[I] [AI] = CをF [I] + C [AI] -1。

点上の任意のノードkのためのI、J鎖、[I] [j]は、F [i]が[K] + F [k]は[J] -sz [k]を= F。

ツリーDP?私も料理を行う方法ませんでしたqwq

まず、波動方程式を押します

ポイント行う権利  Aを[i]がA [ I ]貫通点、重量(答)の、チェーンのため明らかに  \ SUM A [i]がシグマA [ I ](?)

その後、我々は、チェーン内の各エッジが一度過充電されることがわかり、セット  S 鎖長のためにSを、合計が過充電  S. 1- S. 1エッジを

答えはポイントを求めているので、それは行くだろう  + 1 + 1を

そうリアル答えは  (1-S)+ +1 - SUM [I] \ [シグマAを[ I ] - S - 1 + 。1

EMM ....それはまだ少し問題です、技術のその後式

\和[I] - (S-1)+1 == \和[i]を-s + 2 == \和([I] -1)+2 Σ [ I ] - S - 1 + 1 = = Σ [ I ] - 、S + 2 = = Σ [ I ] - 1 + 2

この式によれば、我々はすべての点に対して権利を有する  -1 - 1、次いで  \ SUM([I] -1)[シグマ[ I ] - 。1 鎖の長さが選択されています)

それから愉快的二回実行して  DFS(BFS)D F S B F Sが)のライン、時間と空間の複雑さの最長パスに必要な  O(N)O N- )(コードチキン良い書き込みqwqを)

コード:

#include <ビット/ STDC ++ H>
E [600001];構造体E {U、NXTをint型}。
int型P [300001]、[300001]、NUM、MX。
インラインボイド追加(int型のx、int型のY){E [++ NUM] =(E){Y、P [X]}、P [X] = NUM;}
インラインボイドDFS(INT FA、INT S、INT DIS ){
IF(DIS> MX)MX = DIS、NUM = S。
もし(E [i]を.U = FA!)DFS(S、E [i]を.U、DIS + [S](;; I I = E [i]は.nxt私は、p [S]を= int型)について);
}
int型のmain(){
int型N、M、X、Y。
scanf関数( "%dの%のD"、&N、&M)、memsetの(-1、はsizeof(a)参照)。
[、[x]は、(x、y)を追加し、(x、y)を追加し、scanf関数( "%D%dの"、およびX&Y)++(私は++; iがN <I 1 = INT)のためにY] ++;
DFS(0,1、[1])、MX = 0、DFS(0、NUM、[NUM])のprintf( "%dの"、MX + 2)。
0を返します。
}

 

おすすめ

転載: www.cnblogs.com/little-cute-hjr/p/11449457.html