Codeforces 1073Fは、二つの経路树形DPを選択します

二つの経路を選択します

私は、ああ、あまりにも多くの問題を根本を変更する書き込みなぜ私は理解していません。

#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(10 ); 
    DFS2(10 ); 
    PII RET = MK(00 ); 
    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 ; 
}

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/11806635.html