私は、ああ、あまりにも多くの問題を根本を変更する書き込みなぜ私は理解していません。。
#include <ビット/ STDC ++ H> の#define第Fiの に#define SE第二 の#define MK make_pair の#define PII対<整数、整数> 使用して 名前空間STDを、 CONST INT N =(INT)2E5 + 7 。 整数nは、PA [N]。 ベクター < INT > G [N]。 構造体ノード{ PII 1。 対 <PII、PII> 2。 ノード・アップ(){インライン ノードRET = * この; もし(ret.one.se)ret.one.fi ++ ; もし(ret.two.se.fi)ret.two.fi.fi ++、ret.two.fi.se + = 2 ; リターンRET; } ボイドショー(){ のprintf(" (%d個、%d)は((%のD、%d)が(%dを、%のD))\ n " 、one.fi、one.se、two.fi.fi、 two.fi.se、two.se.fi、two.se.se)。 } } DP [N]、FDP [N]。 インラインボイド更新(ノード&A、ノードB){ 場合(B.two.fi> A.two.fi)A.two = B.two。 もし(A.one.se && B.one.se && MK(1、A.one.fi + B.one.fi)> A.two.fi)A.two = MK(MK(1、A.one .fi + B.one.fi)、MK(A.one.se、B.one.se))。 もし(B.one.se && B.one.fi> A.one.fi)A.one = B.one。 } ボイド DFS(INT U、INT FA){ PA [U] = FA。 もし(!U = 1 &&(INT)G [U] .size()== 1 ){ DP [U] .one = MK(0 、U)。 返します。 } のための(自動&V:G [U]){ 場合(V == FA)続けます。 DFS(V、U); アップデート(DP [U]、DP [V] .up())。 } } 無効 DFS2(int型U、INT FA){ 場合(!U = 1 && G [U] .size()== 1 ){ リターン。 } ベクトル <ノード> プレ(G [U] .size())。 ベクター <ノード> SUF(G [U] .size())。 以下のために(INT iが= 0 ; I <Gを[U] .size(); I ++ ){ int型、V = G [U] [I]。 場合(V == FA){ 場合(i)は事前[I] =予備[iが- 1 ]、更新が(PRE [I]、FDP [U] .up())。 他プレ[I] = FDP [U] .up()。 } 他{ 場合(I)事前[I] =予備[I - 1 ]、更新(予備[I]、DP [V] .up())。 他プレ[I] = DP [V] .up()。 } } のための(INT I =(INT)G [U] .size() - 1 ; I> = 0 ; i-- ){ int型、V = G [U] [I]。 もし(V == FA){ 場合(iは=(!INT)G [U] .size() - 1)SUF [I] = SUF [I + 1 ]、更新(SUF [i]は、FDP [U] 。アップ()); 他 SUF [I] = FDP [U] .up()。 } 他{ 場合(I =(!INT)G [U] .size() - 1)SUF [I] = SUF [I + 1 ]、更新(SUF [I]、DP [V] .up()) ; 他 SUF [I] = DP [V] .up(); } } もし、((INT)G [U] .size()== 1 ){ FDP [G [U] [ 0 ] 1 = MK(0 、U)。 DFS2(G [U] [ 0 ]、U)。 返します。 } ため(INT iが= 0 ; I <G [U]は.size(); I ++ ){ int型V = G [U] [I]。 もし(V == FA)は継続。 もし(I){ FDP [V] =予備[I - 1 ]。 もし(I <(INT)G [U] .size() - 1)アップデート(FDP [V]、SUF [I + 1 ])。 } 他{ FDP [V] = SUF [I + 1 ]。 } DFS2(V、U)。 } } int型のmain(){ scanf関数(" %のD "、&N) 以下のための(int型 I =1 ; 私は、n <; I ++ ){ int型、U、V; scanf関数(" %D%D "、&U&V); G [U] .push_back(V)。 G [V] .push_back(U)。 } DFS(1、0 ); DFS2(1、0 ); PII RET = MK(0、0 ); PII P1、P2; 用(INT U = 1 ; U <= N; U ++ ){ ベクトル <ノード> V。 用(オート& V:G [U]){ もし(V == PA [U])V.push_back(FDP [U])。 他V.push_back(DP [V]); } ペア <PII、INT > MX0 = MK(MK( - 1、 - 1)、 - 1 )。 対 <PII、INT > MX1 = MK(MK( - 1、 - 1)、 - 1 )。 PII MX [ 3 ]。 以下のために(INT iが= 0 ; I < 3 ; I ++)MX [I] = MK( - 1、 - 1 )。 以下のための I =(INT MX [J])スワップ(CUR、MX [J])。0 ; I <(int型)V.size(); I ++ ){ 場合(V [i]が.two.se.fi){ 場合(V [i]が.two.fi> mx0.fi)MX1 = MX0、MX0 = MK(V [i]が.two.fi、私); 他の 場合(V [i]が.two.fi> mx1.fi)MX1 = MK(V [i]が.two.fi、I)。 } もし(V [i]が.one.se){ PII CUR = MK(V [i]が.one.fi、I)。 用(INT J = 0 ; J < 3 ; J ++ ){ 場合(CUR> } } } もし(!mx1.se = - 1 ){ PII TMP = MK(mx0.fi.fi + mx1.fi.fi + 1、+ mx0.fi.se mx1.fi.se + 4 )。 もし(TMP> {RET) RET = TMP。 P1 = V [mx0.se] .two.se。 P2 = V [mx1.se] .two.se。 } } のために(INT iが= 0 ; I <V.size(); I ++ ){ 場合(!V [i]が.two.se.fi)を続けます。 PII MX0 = MK( - 1、 - 1); PII MX1 = MK( - 1、 - 1 )。 用(INT J = 0 ; J < 3 ; J ++ ){ 場合(MX [J] .SE == - 1 || mx1.se =! - 1)ブレーク。 もし(MX [J] .SE == i)は継続。 もし - (mx0.se == 1 MX0 =); MX [J] 他 MX1 = MX [J]。 } ){もし! - (mx1.se = 1 PII TMP = MK(V [i]が.two.fi.fi + 1、V [i]は.two.fi.se + mx0.fi + mx1.fi + 4 )。 もし(TMP> {RET) RET = TMP。 P1 = V [i]は.two.se。 P2 = MK(V [mx0.se] .one.se、V [mx1.se] .one.se)。 } } } } のprintf(" %D%D \ n%D%D \ n " 、p1.fi、p2.fi、p1.se、p2.se)。 リターン 0 ; }