ああ...
トピックリンクします。https://www.luogu.org/problem/P5018
実際には、この質問は、検索から直接見つけることができます:
まず、初期化を行う各点のルートノードとして再帰子の数、およびツリーが対称でないように、その後のサブツリーのルートノードを見て、次に対称のサブツリーに記録された最大値。
ACコード:
1の#include <cstdioを> 2の#include <iostreamの> 3 4 使用して 名前空間STDを、 5 6 構造体ノード{ 7 のint L、R、V、lenの; 8 ノード(){L = - 1。R = - 1 ;} 9 } E [ 1000005 ]。 10 11 INT N、ANS。 12 13インラインINT DFS(int型K){ 14 、E [k]は.LEN = 1 。 15 もし(E [K] .L =! - 1)E [K] .LEN + =DFS(E [K] .L) 16 IF(E [K] .R =! - 1。)E [K] + = .LEN DFS(E [K] .R); 17。 リターンE [K] .LEN ; 18 } // 初期化サブツリーサイズ 19。 20インラインBOOLのチェック(int型 LS、int型RS){ 21は BOOL P = 1 ; 22である IF(!E [LS] .V = E [RS] .V)リターン falseに、 23のIS IF! - ((E [LS] .L = 1 && E [RS] .R == - 。1)||(E [LS] .L == - 。1!&& E [RS] .R = - 。1) ||(E [LS] .R = ! -1 && E [RS] .L == - 1)|| (E [LS] .R == - 1!&& E [RS] .L = - 1))のリターン はfalse ; 24 もし(E [LS] .L = - !1 && E [RS] .R =! - 1)P = P&検査(E [LS] .L、E [RS] .R)。 25 もし(E [LS] .R = - !1 && E [RS] .L =! - 1)P = P&検査(E [LS]・R、E [RS] .L)。 26 リターンのp; 27 } // 判断是否对称 28 29 INT メイン(){ 30 のscanf(" %d個"、&N) 31 のために(INT iは= 1 ; iが<= N; I ++)のscanf(" %dの"、&E [I] .V)。 32 のために(INT iは= 1 ; iが<= N; I ++)のscanf(" %D%D "、&E [I] .L&E [I] .R)。 33の DFS(1 )。 34 のために(INT iは= 1 ; iが<= N; I ++ ) 35 であれば(チェック(E [I] .L、E [I] .R))ANS = MAX(ANS、E [I] .LEN)。 36 のprintf(" %dの\ n " 、ANS)。 37 リターン 0 ; 38 }