このタイトルの下の最初の翻訳は、個人的に翻訳が正確ではないと思われます。
ノードT上のルート・ノード1、Bに、B氏は、隣接ノードを介して可能なA徒歩限り避けたい、今行くを開始します。把握およびBは、それが可能である彼は、Bを追いかけています 2ラウンドの最大値が満たされるの後、確認して下さい。
この質問の分析を見つけることができ、パスBは2つだけ、すなわち:1は、A衝突するまで、上がってきました。特定のポイントまで移動して、電源を入れ、最後に下る2。
$ \ texttt {パート1} $
私たちの小さなBは非常に小さいAがダウンしている、彼らはポイントに関して会っチェーン、上の彼らの出会いに2点を占めるようになる、上がってきた、我々は彼のために気にしません。合理的な分析は、このチェーン上の開始点と終了点に加えて、ミーティングポイントに加えて、すべてが再びなくなっていることを、ミーティングポイントは、両側に行くことがわかりました。そして、上の出発点と焦点の間に行く段階の数深さの差。
$ \ texttt {パート2} $
私たちの小さなBがターンを経験し、その後、我々は最初の小さなBをオンにする前に、決定しなければならない、と何のA小さな出会いがない、出会いは、私たちが今満たされていない検討し、行われなかったでしょう状況。小Bは、それは数歩の距離である貧しいの2倍の距離の端に小さいAであり、第一の端部にAよりも確かに小さいです
議論の末、我々は必要なものを整理する必要があります。
$発[U] \ uは$ポイントの深さと$ダウン[U]は、\ uは$ポイントがダウンして、彼らが行く限りすることができます。
2つの配列が、我々は再び探し出すDFSトラバーサルを使用することができます。
(ダウンダウン[U]、[V] +1)$ DEP [U] = DEP [FA] + 1、ダウン[U] = \最大$
言っても過言ではないライン、上の保存と隣接テーブルの上の図の預金、
$ビュー\コード$
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 インライン()//快读読み取るINT { int型のx = 0、F = 1。 チャーC = GETCHAR()。 一方、(C < '0' || C> '9'){IF(C == ' - ')= -1 F; C = GETCHAR();} 一方、(C> = '0' && C <=」 9 ')、X = X * 10 + C-'0'、C = GETCHAR()。 X F *を返します。 } インラインINT MAX(int型のx、int型Y){リターンX> Y X:Y;} //手写MAX、比较快 CONST INT N = 200005。 構造体のエッジ { int型編、NXT。 } [N << 1]。//邻接表存图 INT TOT、H [N]、T、N、ダウン[N]、DEP [N]、F [N]、ANS。 インラインボイド追加(int型のx、int型のY)//加边 { [++ TOT] .ED = Y。 【TOT] .nxt = H [X]。 H [X] = TOT。 } 無効DFS(int型のuを、 DEP [U] = DEP [FA] +1し; (; I Iは、A = [I] .nxt INT IはH [U] =)は { int型V = A [I] .ED; IF(FA == Vを)続行; DFS(V、U); ダウン[U] = MAX(ダウン[U]、ダウン[V] + +1); //点の最大数がダウンできるプロセス } } ボイド(U INTを解決) { リターン(U!)の場合; //ヘッドエンド 場合(DEP [T] -dep [ U]> = DEP [U] -dep [1])のリターン; // ターンが終了する前に遭遇した場合は ANS = MAX( ANS、(DEP [U] -dep [1] +ダウン[U])* 2); // Uは旋回計算値 (F [U]解決); // アップトラバース } int型のmain() { N- ; =読む()、T =読む() のための(INT I = 1; I <N-; I ++) { int型X =読む()、Y =読む(); 追加(X、Y)、追加(Y、X ); } DFS(1,0)。 ANS = DEP [T] -dep [ 1]; // ないA小Bバーンアウト小さな曲げ (T)を解く; printf( "%dの\ n"は、ANS)。 0を返します。 }
以下のための$感謝\ \ $を見て