タイトル説明
木のために、我々は鎖とアウトに接続されているストランド側は毛虫、より多くのポイント、より大きな芋虫のようなルックスに入って来ることができます。右側の部分を抽出木左図(図1)は、キャタピラとなるような(図2)。
入力形式
二つの整数worm.inテキストファイルの最初の行でN、M、それぞれ、エッジの数、ツリー内のノードの数、木。
次のM行は、各列二つの整数は、B点を表し、AおよびBは、エッジ(、Bの≤n)を接続しています。あなたは、同一のペアは(a、b)が複数回表示されていることを前提とすることはできません。
出力フォーマット
整数はworm.outでテキストファイルに書き込まれ、それが最大の毛虫の大きさを表しています。
サンプル入力と出力
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
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を返します。
}