From 79d14c31ac0ff07f56841a6e2c8d2e5b164c5b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Mon, 15 Jan 2024 14:31:45 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HuanGenDp/P3047.cpp | 11 +- TangDou/Topic/HuanGenDp/P3047.png | Bin 0 -> 25704 bytes TangDou/Topic/【换根】dfs专题.md | 163 ++++++++++++++++++------- 3 files changed, 122 insertions(+), 52 deletions(-) create mode 100644 TangDou/Topic/HuanGenDp/P3047.png diff --git a/TangDou/Topic/HuanGenDp/P3047.cpp b/TangDou/Topic/HuanGenDp/P3047.cpp index 9547ee0..f8fa6d2 100644 --- a/TangDou/Topic/HuanGenDp/P3047.cpp +++ b/TangDou/Topic/HuanGenDp/P3047.cpp @@ -16,18 +16,15 @@ int n, k; void dfs1(int u, int fa) { // 初始化:当遍历到u节点时,u的拆分状态中,最起码包含了自己的点权值 - for (int i = 0; i <= k; i++) f[u][0] = val[u]; + for (int i = 0; i <= k; i++) f[u][i] = val[u]; // 枚举u的每一个子节点 for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (v == fa) continue; // 如果是u的父亲,那么就跳过,保证只访问u的孩子 - - // 递归,利用子更新父 - dfs1(v, u); // 递归填充v节点的信息 - // 在填充完子节点v的统计信息后,利用儿子们的填充信息,完成父亲节点信息的填充 - // for(j=1,jFBBiaO1hbs!H4rU51&4S!M;b6ADfYY&txu2dhRe7a~?Em-i|4HNjmoj*C7&zByVa}UAgv;&3;0Gy;5t}1;I-pgd z{a9Fnn0<|X-!}LZn}Z?ZwVZYslJ6yk!IVM}q-B8;TP5*dNnx<72?)}AStkzSCZf_( z^q0KB&id!?G&HO8-d@W#24~uLUdJBPCEydFizvi)XnfgA$+- zS}?-koruiIGRXJ{4a6cyU6M*-VqOeG~0aDQvTexw>m+A%#*5JA; z9q>i}=;d3zS3b;d>OH?ugGaf+qii!1uFT>vSU?PTqC=GZ(>YPYA!Ah7?~5>)OMdmh zDamJf4TO0}hSK6Na4&{`PNW0wdrm&hD;$*k2Dp|5)9&LZnDyl|h=HyCRY4OkRVF5% z&#|-10${2Ji-b1)d-TRUeE8wm*l zBB?q|{v%-UeGw$Mm*BHsN-uYTv0Ud29BgM{-;VyNd_ zn%lgCi)>YQJJ{qlIQ$TJsGXyCH<iD@>l6IBz{NNAV*_TEM4MMe9c`3=Ok-*gbX?s|MXraI z$+hp&x4_VO%TtzTbkfCnyN2op7_jY&@@V2eRux*)91uw|;A`h!O@zR!Ijg|ax3>1N z0q@onlB@PG6K)-RxZ-fNw$)c+($XS;*NcF=OI5xpHS;<6`5=7P1l&}+m}zUp0L)zd zeoD#J<`kt@j$uih>+C69vhzGUgTlYqfEPs`TWd*#*Evg7kP$p!269lTRC_0hr1SjO zTsA9ru63F5CVv6g5}h^RH*j7YgM(KujQcDR^d9&ZR6zQp8-yU86HrGn3C%}&n=JH? zZbLgTB?7eml$*OSGEBX$P10A4vbO`Ql0c?vKk)$mEWU7K9OZvX@`HD3o;1@@TZRnK zN=jX|dE3e7yX8<(9+_;NOR!aIuBrqU6uT?UW<%bJ3`6KpLI$oI1Ri|BL67C`f;*oG z=&G)UxJmK>gOnstwhgY_wu-HD6B}2!GYu4m9PIQ~QTd_MogY&lUR*9-Sc=^QT1y5j zz9Pv5lg8(@#dkFXFlP=%?!B!Gv>^w23E6sEeX}GLXr=MC(RPpceu15D!@k3geJ%xLgJERXz%V6R-YPeMjh!)KVE5 zzXwEaS;+WwVQ0|5d7%1pB*YvuunVPF7Vq{Li0CXJT9H&%>fx8Sf}=h$(QW9sav!O) z1+g{t0=OQL!P-FWM%AdZsgKdbNgW(kj%}op6G6E%w-p+Jng;=&e5Zf>ow&F5>c~9j zbawXPA|MUZ2Q0c)-KnYW{wH9_F`eB(2WWl{2W~mrT2Hz*UlilI|9+nXm311;+X;PV zdJ%YI^I|gW-yE^IlY!H`+?j!DrPhfa-zI)&sxq2bx2++^GX+1oF%rMRf%+y|J*5oE z_69Ujc6yDsE4{#E@;Um;tRM2$#1oCiReV6xP3Uk5z&+i)yk?bJ{-Y2fpL*g|{d^)9 zq939H?cog&LtJv!r^}&m16eYSW^#3Cv=)r^+g`S`LC#QKbU{Y>U^3t_o9}!Mf7$GF zXFw8p=_G0HdhzO@G1hj&E=5@fRp^|~n9*}5IT?8Z&mkNPUT?AcxwV4BYlrhxPiSGT zuj3_2ATU#wE|E*dm9Y>xZ=^IX9468wRa=U8hPp~S}1sHg}>BOm8) zSv#*?M+*=;uixBv&=|GwD9(3!8$$uYH{fYLrdlr~dCb1BzZfo7 z#s6bAnr!65khM)uZ+fQxMuv2cQ+g^+s&!RBc6-y_raEepQ*>t$m9QK&pdV2f(#NU; zyLTIC;$QP=_E4|t-iqmN@pok$s37vLnfWWeOKXFVO6m?`w$kVOdJgfc0^`S7)^OvR z*%B@CW^#=af(Ze)9BJaa`#ZD#bWMwx#iuC8W%dK7$?4#}|AEG-F8VkeTenV+n4Lhs zK4p=W?f993iPR~rJHc@x4m3EOQQH$;_D<+GSV#2sk}P;;>fg@=Ak`{J0Dn6o7q^PW zWpP!NWX(twT&RbildN5|M^%(%`QD2A>A~=C%;fPAzH6#H%3k39-Uo5x!;NJ$UUa(d z&3dyU7IE@jz!!U%yV`@o?;rP<`mIkp%Wd~2zR94t>BAFUxGJEvI3E*?-alSu%r}9% zUEeOy+&N}v_1nt#2$q6z0GCicaQ%KxftOt~vN$6!cjiNtc&xaE*C@kfpAz)0ZC&qO zmLX%`x#=O}d=s_^zyrQvAK%>pH#r(57N~!QhQVF~50&QOXmWkzK2;=~Nj5V#kbaQ) zH$$zV|8ndURc~Z&hQyU99XU8=dCq?i+tK5Cs$;)=DI7K zWC-#Go3PK(2vVBqg(ndSt5;X)gWB099dR5ov;sLLKoEkFOad~8`}xN2-Vj>k2CCK7 zCsR)}ORZ;c&ay@rDZkiA=gA6x;|=s8_5Pr^hPv_5U=@f4|2_hjtvJeWjs`2HUOhb$ zlK5$m$|z=&0XwQ1Jl`r?MKpJHJy+BxSz4E9^uu$sM$UrCrDf zlw9hod)WxaR%B#GsX`-pq3HDG&|V@G*usJd!L1lEUx*9mUHhToyWyAVwO!A7oG(FF zzN15~;dJ_e2ge8d`~irhpwJIE$2+;e9r-C3nS2VQ*Vc)kOx-L&pByM^u-Zn;Y#uL| zcpUZipmrOpx>i?pPTJ#qjIc@qz6;iWQAf$G2B(#SRrJ+xuh(Bsm(!eNJUn+-{8|0% zX8wAg%Ch<#WUTj-2kzr%$K;`IHK z21*+vBUyueKFbJuGZDMRO=J3buWH-z~qX;!NZbk+B#+S#XcR#lfJA)>2FSG ztUH!4kJLbHR-YbJB-+p2U}T=PxYD(%>gev}^`O=pJg~O6Aks`9OVod_bd#vi zhTYgN+_b<9b*O{()r^Sr67W4d-fk((JZi{gt)G?O$83EU@H^PKGEgdWxUpaFLHL0z zNvp4ytNOHPZYk;K7HYlhwUe2NSU)5_CG;e&!j0S8dJcae3%-;S_8YpBys?gprI_Q? z*N-P~4aibpLdJ)yL;Iy-6LoiXzranXu!EH=KWk6=G96|o+SfA=Du}iyVV6MgoA&B5 zYkVQ*czwl$@W>3=^M)!Tj9$;aadoAae8exIUD_XRgYFAP%y#1k+uL{ir6*YLb||u! zzm~0Os;f4U-NXnCVrw#5a$hf_adL});(ZYNC~2(8qoYPlhVvy9Rvg@7A1XF}0_9;f zx`_AeBWjp8lp`-I<#DgPP*3%GKnnBlR=8*c+~QZWJ;AfI&~NE|4`MlX()F+C`(+b3 zAB=#^cWS)^LMog^$B?q(*dvOR@|!GadX}a%`{K;$Mnkv_&xgpuKO3Cx!>4|St|Ty5 z5V4nGG1E|WXmcsiR5e=pARmr@yg zZ)wL*H;z^eI5{;=H$UJ9m8s}^N@Pk(>b!1X4JFB8zd^7=@9^#)4=Z7HFpP6rRN2d{ zZroMN%W65scT9k=w~p(I6F*sW7hg%`q|XT0rpNBtVDWWZRdR3aPD_iwM@b{ReaP0^ z?J>35n9&-qy*&*Xs=b*JS@I}wx5(B`RD0D@|GgmvV^9NmO?Bc|F8SE z=CF4{bSXwnp{Q_OL%jZ^ICaQAbNpz-B+MvhkU^(Z4spWqFIT6C)$_R+j7A+zoLBWE z@9FnfcTllB#z1x}OZi^EM5&FfYGRJNO%S$766{=jE_%NTx&*yZ$eo>z6Oxk1p?Y*( zlt3QjS3?CRc7Q6o7|3P%A2jb2it6x|g%@6tSm4k-?kviidZ~dL)Ac!e!InF=>CmLw|B7kL*#9`IM{aM|j#t_*=ug+` zt7^=C%@xF9D)C9@>8_`z>WA0(PuFqO?BiQoJ&vo3_R)SV)VL>QK3WI%{_dMJT_!3}gaE;n8#be#*E$!k)=t#TB{l z?IAey6@UD+hbQ;?Mnag~{*`l+xJ^<|PanS{SDoGqE7VA5NZ&&KXw=+Eq zd=1lEkn6$^Gw&O0Tu*f*V)MqcJP0q57@)nMF#L-~Ljwf(?+hF{&|7loV|<~i?8tmN zRuXN#zhJ_JT*j;VyPa?(DgRuzh~7Bqqq4?f&(%Y4a^fU( zQG3LJ9JUN{%sx?7O`U|%VTbDlCO`8!1BWz0(id1crBuH;N2}p~6hrD1)Y$Luf4Zco zaVmR~oM@a>yE;*I6!;_8Cw#@G5cs)puo?@&a{Tmd4_0QnAyX!~Ar32zUs28%GtS6p}XaTey<_gTV z54y{8vP)?U1SB{l>hRb&6le^{1>-B>5Y-cq5Buhe;&N1E0rOvD_5V6 z?|pYhY}S+ONYuN!k4>!a%X(v|qjUBsl5{o>dloe$Hd}^H+O#SQk+X@_sYBfyAV+@c z9$6@U>U|_mL=+I?Bx##{>0{*9mXnVC!qVu-r|J^@#j&T{Det}4l3knISBE`v zTg?R5ecvHTvC+Qd&PtsBsS*Lcx^aBm@&5GVAa2OSYaU7%V&U)kIJP9eHTl|MV>t+ehy7$(x`$l~a4gaZ{6bPqV zB&J@9F-w++fq3&EvD#*Cg7viTZBJ|L{?A&(YygeKn8j6?8$iHrr-)5D?ykM$=9|Mg z{M>oUN!Gu&lr9Fx#9cwu5;Wegi_}jtxPH--f%hD;PGTfv#$Uhk3+@fc)ZaG?ZU>xiLWbg+IV4I*PVRw##jD>+)Cgv~xf6 ztY2#l{C)687LD9lONbsPbOO(}wZ*w=ljd7cOX%(A{FH}%#@E5BEF}e!MG6Q85rU(} ztk@@?XcX*R<|6BNXhLo^#t9Gx=vQp~*4=Pl_6Zy8`@U@%09qObxOTR#(B!%u-N&y~ z#@U54hc`Zj4TixF?jdma)lwt$)_Zi_Ru7IxozUnrN!Yo9+L0H&e+49v9KdUam6@Z) zlDPaiI-j5@xO!o*vP&RG!mMmLWvxmzsYqUHdV>0Q7aErV<0ci1#S%CVEg7<&{j4+K zpzIzPHq7&?He)x|X)HV_`E=C14S_$0+QDXU>6kGv{*5Rrb1_q(2G?|Fi9_{5w=1T%&9 z{ZM$xNGgj2FzKpVt@P@58<4ie+==!4%Qp}19J4Pb1xnpEfsjx zhiB&%&S(V!cmT5Uz$&qHsvJ?Kt-S-|1g>EITt%Vtw>+bH(6W4(A*MFnj`cE*1Nv=txL) zYxR$R9v>j|I6w$UM5PJI-@Hf3v?Y`SP|yYdxNyj$ke?#Gd?=#-K~tZBZHR=xiIu@f zECr2p0oX8r@Tk}(Sqes^Rn)y`vu+bxMZJQ-^1$ZKr5Lr0d*qv21V?&#k1-8HD9&vV ziZ3-Gvy{D_UeLGzA&Z|ypqk6oSTFG>!mmVrD<-_TpsX>_`_FOb9@K zS3|t20~+DeTD7mzV-nt4S5%M#K~aF6(acPkbD%OV!-EXZ7T%u4>#?2Ra#Hq@%xdVM z@CnieJ0Jt_^VCIB7@IIaf>)`r+Gg~?-Ub;FjQ1LeU~NFUMWrLp)Sh-+mEe|T+KBl5 zPZT~0p}XId(8StzCW}=Y$I7k==yU~E-<%_YeY{GD!lB#IKCKcGG9fv~_d4Pfj{9A?>&EumHt3#(aX&m{}Y6R{G>-)K0_K$le zAyEU7RX?$N(o?_cjKHqr$P-nz+$oDi6O%q^PYeCNOeUZMiB5UvxS~O-N%~yD6VoBK zHD#ZseSkVUoeT(I{te&&XiIa1)$Qmu{t@jzZ{%O*Kfhcw^z~#8eS%Llkwbdyo**sn zFM?AF(3gMm9U14))RB5Q7i>`hZE>m8@Tm9n0DF4Usd{Qc*p_wn!T2~4x=iYDZ!A`F{}QVgRLR-!2+j0A+mJM`4&$*&i_at^UY3N zs=t5lP7!_fHS8_>b^6;Tro*B_KAwv)VGFjUL2uf#SYQEdyV6e%0a386QzybX!zZY4 ztd&3e+E)nt$S&d0Ed&SmI13}#$m4&Q)kT}0yFnQ7KRD?jnC@V)lehs)4Q>{_^8>kB z{ZIj=8d9u`EONYLXcgP!ZA*byG#SDLU&ch=+(uDUo?*}d1IzFRRLXOC6u?HSb0Ol4 zw%RflH(&uC;G2jhq(d8{&;M`&=pr6KOO)ejS}jIH<#|YOw!1Tope>EW9G*kQovN3@|1b znZs_(@fZ)T%e{xtj7H?vdv9;a`L+h0uC|B5In=vt3tBvfHvc19CPj#nH>`78CEj;F zCG5)L3VEE7M`v5j6#8m(xJ+7Iyor=MVLj4GJvlhVKLIB=H;6%@>uLWsd%;(Anx$ho zY${ijy||56B0%+SFdGvSRPDcV#kts7OyEo1-fZa*K#CBHgQP14(;_ny(yUjpN(08- zrdc+5s$ThV;QVxB5Q^LzXxuEWI1cN(bvoha7O{A86uk=4IM!3S>STe07ORRG7Rg?r z9|c4h(S_TnGoM|gfM#c`K3Ty2t5z3Cs?)}(%+8EBqiU$J+$=qfF=AUKBKl9FAvM0; zRYrPN&0F>|wQ-&ps`lCNZ!KY6AD>nB*o6A0geh)-+@f3Y|-xTV7*}Gf&qJO}2d21iA%|o~C)}2=Qf^K#4)0 z)i5y(L+(f5W2Al#TO+fE5+DS=L}y$kN@tt$?<_SPL&gTTAW$0kBL~E z%p?S#?sa!n)m=G0>B;aX%Y5U$A1cxJkK*c#(R5%$&dS4H+|Q4jeYXL~UdBL(sx$;g zi!BE9_D$ptBiG{|jpH*B0-Mbh`>1skpRspqCU))C@tjRueV8`NLcWdRD`YyMLfb@8 zg-FpHQt7Hl6KQa;FEeVsy5aUGzwZPeBR;KB>v2)8xzVm)wK)Q*ABe6fvoJ9!6RNh= z_v?55Ro?xH(?FN+Jf_P$>E*$#2Uh+FD!KRYt;6G$o73}6Pna$wz zv1#x;klVN>o(E7bEGdluZ}|22JY{*J@J|p4DUXqRwt%H)LAaD@&3hHg@Tid?fAQ^| z>1LZ_V%R-C0_76Nq+n3T1;v6JPDarZP^1|46+^Us{#?js&S~$DPpqLz8#M@C=!%U# z7qT~8#W(l9x$%a|*b=(GG`GNodw(m6Y+aO`ejut>YgI;uedj6&{$v1; z^39D5D&wQhN#K-}q(}tqC#g_7(GRxk*|{A2QRg-$?*DP+No8(zBzB zlb#3yFyAdG;)?o=dDxp`@3R#p`7_Xyh{~8-h8YHv_=F&xr^4!n%PI;lD|>ad9xcQd zulST*yaGaD{%p*{FTA~aNwSI^UaM+^Muk*Gg5GE8DsQVo{0-~S5ig1V6#-TL)$(HX zcZl1UHN1YOE6C6~dx8#%Ye;Y^OJ6V#UG;TlXIRKJc^1T`-|IK0%Das(sLt{5N0W5Gw~=??ctJqvU4A#Ha*1Y^FK*58S86I}`B|ay zJw+9Nu46s>^~6ivuj+$Q?UqhAKq|P_i)9m^VF@kov5oK$|1|>ExpEl>+m&t$^HS6| zYkG!TEyj z!guE&y?}{)7|dY_{!wNtDs9;Eypaq@SHl3qqfOF6rg7I^yV8QvHK;ecu}{WGeE`h> zrilnrGJB_bYOK;HKCi#ckeAz)R?=FHuYk=d0x@!>AxN)H^f~$jcSRbBK@C|@AH+pV z%_VMJhhyyq+hh#&Sh#649|*;6_hZ=tOSr{9dMREwCX-oO6g&re#!H~o7AqfrSmGdX z-Klg+KsY<;r}o)5pmkNJqZFB8<4^p^fW&EN!W}T7pLL?3*+rA^LyYRi12RwQ z42b-PzgSZiqnct$50?CrRU8x5jWWS~2h$&+@(`bI5u`k}M)*BTq){r;@n7kv+4HCB zfuYm-oPo_nNB#mI3vG#DDp{CceYG=2eydlhZX8~_lOu$AX&M{)WcdQDEdxOso^o%} zQOT>}iMyDtH8+FsdsmTcCfH{#JWG+oao^Akqi%%Bl_pEzOCC(_O6#h-Pe^OMF|fy6 zzWQfe^OtWNgW~YmJ5F$sS*oGm52ztGs=_XC@7$I_(_REP&;NFCvqQj-??-z8pF$ji z98)FYJX$QIWtIfSrUO>7i1H|{67ep}w*5AkKb0ViBM)ABqe!iO^@hM%8V6$&H*ziJ zY0(mMF8C*qIpX80iXw-~;sLzN@Q)QGRpKA(GMYRSmemIYOwxG7oJaFaJYu})BO$GX zcBndRaG|FfUsZBP&b+CYKmDp$OvwwhOn~wQkop6>{%VxmvS>V1aE}n44mNlDF-3IN zz!cCKsp0&`2q6ZJfWC0nqCl0@eVQulC;ox?G@T3B6 zOeq2Qz>lD$3zHbYKdvN|m4;d;06YL=V?86Sh<;DoS)JLe&Nw9@TM-<3TM}Bq8VI*h z-(TyGNyWK4Q1!hb3|cc?CXp4gO5iDfNiFE|8N4NqlknjlB}^c#ljfivi4mY8H#TiK?_#X|4$D2-9pwwqZk5u3P*d+s zdo&|ga7?&D*!2|6$2tY}^^?1?(EZP5hi7^0N;e+FABx;Sg~D;r@#?O6|Q^)2Cz2n|6WHE@tC9{9Qw1?8FWcX_wUm^q{crT|baw*KH?vM&IjmKozR< zvAsT-f3o4QJT)O5C9n38G2r_ixBvl~DWS$ZMi-_2?MtMQh}~*gK;LsbG*OP(?x65Yx1(5H>6F_40sCr~a782;sF#ID5< z)kdU+AKw6)1pumF5rd#i4K`*K<%tzP?|pV~_rcRto-FonFL&zfb=|xBe_58acl=PH zc;S*bMt+hK;{fe6W*L4jeBspyH~mHP(d9Phi{+3u1!iM@?Vf9qCU@W(unnDJ-482iH8UAAuTa&H@j=$bN0$oAf6mgd!?FA{P>GeY1 z_-Ko_mwDSM;9b2#nY7c_W`r#7%p6r-L z0B!U5HQwplXG=anzkhCC5*J+d@WQ3&5oLViUc3Mktmn7cAbgCPI zHG!TH5@;PIyg0K61Y~spwc=IPH1+tEiZr1DI4X#Zm_OG{b>5lOGm=-2O-fM{S}q5s z39(5L?}{RhO?Z4!*v$F~kS$0xNZ)@d(*SXJoBZ$#>)7@PpgAC6pp5!7Z%kEaucW?m zM7Q2H#z2TeHi0-=%}t3?GesY87BOesLZ& zasv(eC^VF;J=9QioWUjx`NB?MFn-<+4#}a}qDA~il7D34M4&UH#IqQ(O|E~JzK|4e z^6~6aP6C(m;-|Z8KY9IIr}obuLMNUBdaHYMA< zfIO($BlLSZaQFYRl6;!%Q^5g-B62a$YZn$M$=mpUO#RaT<6V?&Q-1cvH_USpKsoBl z<7cDn&l@|U!7+jMvM4vbtLlwrfi>}aTsuDRc)g{7ZVB#6OW5>EJl^3__A2{EWzD^# zmSCtr4s#J9L_HEsd^f{#^`leO{4>i3K)e!B2*uDQWQ;@P+p15(ddUgyP|C>s5S=BV z($B$LY)15EK1M&%SwW3l8d-=QYeOjio0+TqRK_+5re-KD?~3?&l710 zDl9@4BoTs8eApz-X4KsMzu9<}?6S$!_a361P4fAfvvEX_(SjB=uEZ{QoC|}QTbG2^ z0dbd19EA6ovJs+g=~4)^*E5*9bt#X%j3b3cFA}1T0VY~e5=53<9wa<)=J|epLMSd2 zZNRoaTUe`sm6w1FnRyx{0ef*}hb5W$cPyaW=L#VzO^-~V{X2>F&1owrwpsd$iQ(IF z@}L`Vxmq!JHHr)dBk9Ao#kp06E!2*N24sBJ4W}Svnsf%2#BlA;I&3o0=i%*4R4~WaL2h z$yc#ozvl(rl;K~P%3FY7cK}S!HN4=vLqrf}I`XH8Va$)w>^yW0f_g81-?;L&S>oTBaJYgIiUldELR*wd zpO)>pqb&CzW&5OzW>?cvOUVuM~xjxzyUuX z+m-IKz@>7fnoGQkmsH$*dea9o8W2^+Fl_MygSW7B=}lvF5VTHR1HyRld{_E~IgX^E z*O!_I#`YY~VprjDTT-m~8E-0OFDY+A$^as~ak}UKBLaffN7Pt=Q9r(RFbT4;zFp~=@}({?heku-%g+1IaAEfDfZkzdgIxb?LMY@}U63%8|0B2fohx8+ZM%`C>7tDHW< z%eRo02FX=yS9*|h@_R=VL#*}BoaSmK@KV5M%y%JsBQ_=kQ_QXZJO9S6bmRB&X1D9Q ziISY0Kz$*uL`MoA(X)TC3@s^nYP;-~Q=a&%UzZs6p&zRoS;bHKoh3(2dxAIX@N!#P z9AsYsb4&1|-?bsCdg_Vo3(_<97U!BkUI3lL*Rny9y1Df&!u-)Z-I^v+H2YZzV#8kQn%i;qz*da z)4*c+zQf?YOG||*Bz$H<)CZ9vnHiSfBkx*Qy8F8F@$;04lW(5|rS;1yqR2rGOA2es z#e6@n%F;sZtJm?RZsG4yMS@^%yPkSFly~%f#eApa3)&J}U5vzQ-K)w{Of+L08L1Tf zMdp?e2X#)9^e$6(RW)BoB?spCJEouq$nSbJ8`fWB_YNDOus? z>Yi2ZO?W~m2rtTGbZV?AJd6sO30pWQ5jkPM8Vt>t+Lg|+iTvYQ`$T>9R?VCFCxq?f z1$(gw<)9>)EfLJbGsEUN8_$lr-SLpZi{M#QlU`*%ZqcW&8)%a>->j?;R}j4y%)Y>7 z4h2~uYG@1d9Y=RI3!|-)dJhS*X!$M?xTsu+>(8=zG>>HSS+IRk0X=(fp#0mwUU4du zfxAFl+rUAL#hPGC;B4zN3ahC8X&Rf~(8hTQQ4h~@$??CZ+DpC6lA3%$sjRJB*#nKl zzaosl0>o)Wv>EruX+~zYMm=U16HN7jmc`sF?QMxNhA_2xN?!%#iu#huy-G`msI=bNcEFKwZ*`+K#4^v9{PXy~Nq(2uF zp(FzWUd|F+^}FB|5g$lP-~Gkf3JwgELLT!h5z!4t1m|3Eamu;dtA>=y4FCWYDGa=6 z^xb(hHzR2;i%88W-tN!%&wvkCwvAa|hq+sUeL`&lFqjl1vm$jg&&2i+bau0mS3l_ zfvzklK8LNPx=6>T>wW2Tl}ej=1o2Y@N~m9xoG&|gbY-V7<=kNu>$+lYGuW6QH>K`+ z6WUh-zzPcW?Bne{F5gZSTROr$cn%GNWP<2z=Xa_fwbq}lhgl@OQm`c~rRLkh$axz2 zZfHS4JWE;5{7|j-&~DPbT`uWgks4l_3J?0A>jBzkh}G!r?<8WgT3Jhf-&#&7^k3I# zP0JbFkGCa<(3&y|LKOLeuDgC~pK~LNh7U;jS5j0xF2}z8U0!RjDjQih0BpHrXQ1aU zKX^+6k`A(u4?S7dXcoe*{m-Yx|9seh=+pFs3}IY{^oscF2&o<8tFksf>OGQ6D%NNc zp|=lAi2#%JgW1?kT8}sqF?L*ZLPe1KLqd?)1!FFw+^qXCEV<vL6M^%?5* z7OHTy`+}sR^qb9>Slg)&^Z)MgCH_4JbMFUgBa_JdCpHve#BNEw03bT?fzrBs#Ja*0 z7IrQ9rO(e_gBNN(^fxK-e<6X6Loll(UvQRd6C2`E~4e3|c zKS^PbIEr?q)kSp#hSb(e^(p^ ze23d4XN+{ySG$!S_3S?;iw?`DfF(sET5ASZT$fTFqb%HP6gFNGg!EMB-&CqDK6yy0 zGDW2iGiAiH&{y7xeMKwfa&z>J_{fL+GzAp-iuf9XgtnQ!5pk?r5{P;sO2G1$?0&E6 zra4T$%r}`dd)Tq9AAHL!+pBq`LC~6O!4m6`K{7^gcIlRYWMusn)BBaPRx3O%2k&@U zmX-AL-CmyFAMWYOr6N=}Xd$tK*M4lp5wx#ZI>z4&wkQ1UT>RW?#YNYq3~DcKKnjym znrN4hEX*}FNuU1o5dl>nWv6{!>De_`GCl|li&AB-75W})#+bO_@}1-k*=^p}mz&o_ z(OZ(s*=LW46QVk_c;X_@?!_i)?LMhv-Y@;JP3OGYJ_}LPwSgK4bVNC3U(V6knidGl z-*Lq5UdC2*`+PTiL=IC^M_X{MUY%LG9{Ho;Ug7lbb~@BK$>k63(DFRMZ>JP$e+iWE zRLqKLH>X??Z80P31l1OhkIs6L78{vy5B@Hi`TN!;sPp%vH+r{H#mnJmARR0z0ns|2 zVjo>X5}|de!#?WCstuisU8|iCW%&F*`o`OpXW1|159BLZa}sj$dqQy^2`4nOWoq5v z#pSqu?9Zkz$O~&irrL^E?y(F1oI29Zxh~gYroY!cw0Um`m8)sO21yqbZI=2CokfN? z#IBcp&6u_!bovJM_*l1@C%^kM2c7*LJWGGYW3xL!+UiuJ$wKQ5!Vw)1%mZGmic;^g z3X0?ibXyLn^io&Qm)53CC+h;JM=F1gRJ8S%uV)(pxe)UGOu9hP4Nk_sz_HzYqDP{NRF_iw~#mL16zM z-j_lU*KvQb!$XEIBMhq>yx50oTUvbOdvYuyF zd_+EBXCwK(jH_PZ9Q4{%D@hk_F6nmgz}>hcOEyu(@-1a_yJE<@xUf1+xq(n&a@r0^ z!d`e5KT4xY-Sl%cDHe!0XBGD8_}|bMmAlg2UEjmXgv{I&ZD@EF*a99a?#d)Rn`ncDT(;9CR2do|wMX zM?b#~65Yx^tjdrfcju?cB4vqxMHV@d-It&1cZuA_-&TCkp>Zzgp&g{-;GMMDcVt6U z3AfccLjD9)*TR3f2YKu?>(Gz(2O~Jq`#`I~U3wZ=x$AZUg*R8c862(~S z--hR54cWU$H_=4WIDtFG>dAl9EZWPHpHZM`6{HU?fI=~HSDMc1;km%70%w~MP zuOb3b>rUc(Hs{Z(bRS;vYtoNl&L`>%Wr+mm{poDs?oXW7;dQ?Tz2}Og;-kar>wR>| zt7%>2P7bmiOi7_YUwr3l0YR4_yBCx$)TE>`t9#Ye8AhErU0wSO^CKeo7*bA&cL<%d z1r^i74`BlrfAb07Pd%m2`qa#TaQL7Stj4t<>_iNO&wr?HP7*z?5EoBj2&XDeSgC=* zM3&*azg`8t)n;aRa+gQwcqZhTb0mPWL5@#ice2ZB7Jp8b?#9=_&WcM%oSA7>v8JCF znlc-RVU*dJcvZ%m*X6%5$DGpq(?<{AQ!cr+_RxtXIOuU7DD1#YDF`Jrh$T+RLQ9&< z*&^Kn$iaf@;zxc$Fj$c)n&*-G+w0#V8nn|Q%s(eMOjKZw(H-F*ggHPx?Jrh0&f}u; zy=OO7m1Qb#qYOa}6xQ%?7kMn||JTIzeS58sfl^zoeDk}St3(=w->bg{*2^=}hHi6$ z&?{>ho=i>)BpLWjkRpWbi?96i2sNl)m0-=%n0<>Pc43iC$okG2ndn|Z%;0lTZqS{U zi&wVj3Di3(sZTjeW=xqob0jQ0TrJV|QA4{QjhorJC zztHBLn0Yf1F{&925b7!Z#k%z$lTG%0dZ|>)%U0~&^4^^2?v1&@o{{}$uz(2ATGkG} z6KO5T-hSA)A*k#`C$u@dd6@<(Q5k8ctV*eBHmYnGs(NXT)Ok9X-OUh6w$_)Fb$F_B z_A2yt?{U6ts8(k7U8X1JI#gf(vlF3K@msJ%oCEW{WWIv_4EHdWUNDu~F=`=7lfF_mY$qdGY?YQ`CIl+h8&D~_BpG+_u;+}n=hp}1U zjYd<#t6%&3R&R1?sFmZcHUEma7E*kBq{D&HF5UNIl^DiKZbjmeU2yL|ux}{>zgAafbA@4~uG<{n`-eO^ z9GqxP>kLbcRW@<;vtJIleRtL?H^{Q+<3N^z8<$=N<<8ufOTI6!bF@RZ_FoM&yOb!0 z4x^&Ydr$T$H<6({vo@A*AAeZA3KMA4#Dg}!zu3P1<3s6+Y^9q#g?+l>3DyFW#pP;U zUjLFg86N@M4D>4|qNuc82bs>>#Ec8H-H1cksLGdwvsbhd5y6yV5Q#~T5NkiGID8J% z&B>xaBy&bi~ei$MD;w<|Axqv z^L?lp4Jjhx-^Oot&HRhPg-eDv6}=WlWEnN?EGS?<%c8*GEO?7 z@DCa^3+;Tt=FuZ$;8l3M(YX{kv2l@x%^aQ2RrU9ikwgI;OYrX^{)RuO#^!Cmwdq+nJ(5R%jf(!| z!b~j+)#!|D5gGNLvh_u}l@b?zk9IUhRJV}WH80^{-{97wthPMNyIx^X) ze~HAf2SmtDGI^zY5oX8W&QU-c#CeJHt%lJ`9t4+Hf3Tw2cC^Ay&!#SO)KXe_R2mF8 zUx1lj0R3_mkH|an85^Hpm*A4l5K9q`7att>t4HD54nT)GtAA;v>0u??=!6B$@k0F(ji+S0^u_!k#`553021 z3gvn`?rUlOt>l-TG6FRV7%XKM>2dJI^M2HNBeRQk?vUZDwwnbvI+$=BG0eN6EU#_e zM99U0-#~!S^NC9-avl1A(xM*9 zz+ZMuy9f&aok&8K`DI^Ew3v%iNQ*ZG4gC%Q?Fg6Mm;ExlO5;#ZGZ1oNVNN~t1bcvo)>WSk!5P_O4>22CB9 z3sysL%yULYaOh_^TK;0`29BparZj%<+TVDx8mPt4qiE0a8?1Tv=TUO>ziLYHlW>;P zYeN10A_X_A3lWaL^@A%{Psesf_E7B&pml5bht%%LSrkefWvMI^x^mCypMdy3XZ3Yk z^zl>$u9)b~@k*@pGhsVf%G84L=jfFje3fID)uH_8PWzC+>($!Sw}Q`h9$c1OD^9^K z@t*xCfkAhm9CiPkX>8gnbqQNhWQ~6|LXw_f@*MZqNef-`6cN1itXT2$>1W5PNym11 zsf9RH*@;{K+^+VR8ffPlo&Z`_xx8ee_x^_85#P1M>0nWDsH>d_jvm8 z4Y+`g3a32GxNC3)vEkBe9gZ9;^{iMQi|X8BK5cg{J^%$MNIyR43iFz_T`!fo*4=zf ztkqG2AVw)T@FjI+w$pN|xuV$Q5$?f_ZQV&A2k%v>Z@A)L`WUPDo8k*|*BMCdGBC=N zraSK+XCT3EeDq-x?)CRHtufYf&F-?cztXpbcGj1hgNwtSzVWH7 z&-!AJy!WxYz`MT1pRz03^d*JJG)x!43)(n!4e0xjqI+}*tn6RaMU-v{!cqs{torp#-B0OI3+|$7?i_N zi7XXHc1QOuvYW$T&}LT}vQM(V_sn};@Bi># zm-)r@j;+kOKBnVnVx=z%G6NWPd%wkw4{aWIv_Vw z_#Q;k^|B>>2~M=Ns$L^o@#D)Qu1Sa3yW$7aauH0{CsKJ{lt~F&Z{s3u^e8jPa>&b) zqLmb*uTPx1PPksV8W}oFmwMam4C|M`#)}fq?hjy>T!9H3?!d1#*zD-E^wrmv!%%zF z-9B-wvb04{(2+JQ&lHInVxLG@?7n>|g|Mb13Je^?uCazBwe@#Sm`uRt$RJxnJrzW!y_b zpQ~s9K_Dmv^hG)EY{D7VD_~=?DB;!WN2ctGWLuaS`JmnKE@R(-T`8pGjSW9IAF1;+ zPidJtur=?_i}nTQQvyhS>)e+KhtO%cSGC@6l8aWsO}=De9oL>Q_nZCT27IuT{i45S zjgm{*Z|}h`GAx-cRVd2Gia1CYc72$f6jWfiGlSG-RV<3i$TrD2x-UXJ=AN#z>(R8F z>48w}NXyu5b^WftfP8Lb`P}X&jcn_7h6@$Y-=*F%cxBIS2h`0!s9VpYHs?4KpSC1?%dE}%UF2Lw;y$+HzxDrFFIxwlx zVC>v6Afgq0QpvM*AO9+1t+epHRpc2XDFkDG!CPZN-g})v1XB|9I3Sz0u{ShskvKRI z7?tf+_S{2H=$joJqgmZ}=UzF_#c81dckb6yHq(|vgj$DhRcc{@%qv<82Vu+@O3>@N z(9WWGBri31wQe>HhkC4_Jj#g2F8S|YH_=WT-&(z4Fk4hy|L;Q~y9M|qU=q4+Mk!o4 z!VlCN8(RUKBS%rxl;G;h}rb)8huGwzU<)opiCMJfEHzeN} zyVbmlcodcR^VdlID_#6n7ICI9JunmJ5-heG8QRU^rEXI6G+ptC~e#Z@})@wk6WwH9J*7 zrW$hHWl2|3Vp5~7R|;oU3iBknuv5|&4HGFQn!$~iQpDHV_DhpU+)-vUy;(i6IiZp; ze%?Q!f5P>kOvbS2dO72~nE*(*fwSfIzH!`#UNF+c#ChWKoBs60LvCSe&Ga-|4(%m* zmF%L~mUAH`!ebErxIMQXPxGsqeL75%a&4TK$RCbOkGezRbF}ZJd6RA)6Mi~wnNI0E z?cz9`|1eJHUa}MS_nP8aqh~s=?_+xCCT;%9?>t#)YN7tkfovbI=L0V17DKtAmmD3s zbH}&((U;uFd(Wso=x(ld!68Y@a;yidJZ0x0{~x-OJ?{SJaur&Oo*MkXcybuhoP9yv z8N&*jPY)Pr6AaAds@s>{nr@tDUs@h4k8ev&T`s^ep_7CN%D(!HoojRU^iHTv+3aQ5 zlJK;zH3bo$Ncc>J+kqV+idQbq8_Y5ppKSo#xtLge`BvRItH&3GPAqpY(q^LaOSgy- zr8OgDer_H8?{|fIe$H{DNxY)U3o&KSI@ZFW8WFSb;)iEV@d1xZMpNGUrjDB{e|t+f zNwyHyRiSl-3OlA7a+QZJ$xpxb=BoWc_Egwbur=-hL+*@OPBT)X5-woSQC%tX3vzil12)mM#!Cv*erEKEoGttNa;vh&d_P6IZhLa|qT{lcrx8Gc>`42?9?M6cpKRYjphGP{(C8 z^V{ZoL|A^f^1feVoaK+XZZOTfs5_sZ=;{+?GW)yMP5OTS)%`i+XgTPSiovAYO7w=B zwuCrL(QIoBnOJi3+iu?lKudw!1BUD{a4ANuy6dd3rqWDES3nA0dmF%_J^Nk7%>dJL zeMfP4+xvGLYEO^X2C21weMNpa1~jDMo#|3*hYt2jFcLt06Qa(uLk0(%-ac^}Y9`Co zgdQhr3GbJO04>^hcBXD8e-Y_$*jPU849IlkN`DlTBM#|$ITA~UxtnUrZOL|ff%R{j z@kOBVb(Wp`vg$zmx*u+lX(lfpl1n-Jw6vEPy3+T4a6$l>(NyzTj$c3(-Jn`JSSS@d zS0t~ocwWON^`VnwPxE|h|Euue&mqtgQu(tyxl`#kI8MO|8V+bmQk-es;=qiTTAsr2 zq}}ILla1SK$`e0K%Y9pVDS%WOW19pJ0|YLuIjwtmo;w8fq0$QcKz>jp0Y0LjS_VDY z#K0z0kpaq3WJmks35ax{+FL^8VMS;G{4%ehJV>ai)<0F3co9#?gn+n}+wA;dgq>9c zNf5{msWH#asT!P6ZfN+RUg`!yR zQRM>n)tzorc%Bm^Ox<3j1c{)^i8`W460)43cGU@U6(`INp3s^oIK8k54cyz)Y5z(f z`$MwO;c!&30aojAuMeXr4ra`&=hb+m3R_=Dm`|Jrery)1@HOU>*&n62=$T7A7Uj4u zdyTR85vQE({4#{7_rXO&hxY{Jd<^!K#r>vt%iY{CF^;Pf^Q) zD=K9W#B_0JbEJ2$bo?AWeu?;osKxIV=|=ekZ@LvKXb#f@Z3U(RGxBe^P;DU3;UpmK zuHU7ncU;1#n82Tp!jKj3M_A$1I0BCj!K22r?*GPaa*i~YqsqGSi4Mq>Xb7+B^u-}} zNcp95@hol|&g*m~o=40HBUhbE(P=x3dU+jyd>m|d@NKp`JcPi*J)?&3{jgjsNMJ@S z{s9fS%2Mukm$y38vApD5BrjfLwm&;Og4a7}ps-Y-s1J8vW`v8<&f)mgI;bg8BEcaM zV)4BFfNW=^+%RAkee2PYHRmJ>>Oz zHEWS_BK$_iu;au5>tareks`cCP{+U>(n00ySLI3ofYg&%jzxl=mp`6(^|yB*AP_78#i;kjzsce`foJgi+I@)n zyO~!oBZk9|(}4CwV%Gq#b!!W>)+oH(7W)GZ5Z-uzpeI)f&;Aec`1=7?10Nm&t~{<( zAzm?tmG8m|6s#cO3KFg$;R+J2AmIuU{y!t3Dfz **解释**:每个节点,向下走$0$步,也就是一步不走,那还是它自己的点权,也就是$f[i][0]=a[i]$ - -**递推式** -$$f[u][j] = \sum_{v \in son[u]}f[v][j - 1]$$ - -第二次$dfs$我们通过已经求出的$f$数组推$g$数组,对于$u$和$v$, -$$g[v][k] += (g[u][k - 1] - f[v][k - 2])$$ - ----- - -题目简单地来说就是: -给你一棵 $n$ 个点的树,点带权,对于每个节点求出距离它不超过 $k$ 的所有节点权值和 $m_i$。 +给你一棵 $n$ 个点的树,点带权,对于每个节点求出距离它不超过 $k$ 的所有节点权值和。 对于树中的某个节点而言,距离它不超过$k$的节点主要来源于两方面: - 一个是该节点的子节点中距离该节点不超过距离$k$的节点的权值和 - 一个是该节点向上沿着父节点方向不超过距离$k$的点的权值和 -对于子节点方向的节点的权值和,我们可以先通过普通的树形$DP$计算出来。 - -因此,我们先写一个$DP$计算出子树中距离该点不超过$k$的点的权值和。 +对于子节点方向的节点的权值和,可以通过普通的树形$DP$计算出来。 **1、状态表示** -$f[u][k]$表示以$u$为根节点的树中,距离$u$不超过$k$的子节点的权值和。 +$f[i][j]$表示以$i$为根节点的子树中,距离$i$不超过$j$的子节点的权值和。 **2、状态转移** -$$f[u][j]=val[u]+\sum_{v \in son[u]}f[v][j−1] \ j \in [1,k]$$ +$$\large f[u][j]=val[u]+\sum_{v \in son[u]}f[v][j−1] \ j \in [1,k]$$ -到节点$u$不超过距离$k$,即距离$son$不超过$k−1$,然后加在一起即可。同时$u$节点本身也是答案,因为$u$节点本身是不超过距离$0$的节点。 +到节点$u$不超过距离$k$,即距离$v=son[u]$不超过$k−1$,然后加在一起即可。同时$u$节点本身也有贡献,因为$u$节点本身是不超过距离$0$的节点。 +> **理解**:父亲的生活费=$\sum$(每个儿子给的生活费)+自己的社保金 + +```cpp {.line-numbers} +void dfs1(int u, int fa) { + // 初始化:当遍历到u节点时,u的拆分状态中,最起码包含了自己的点权值 + for (int i = 0; i <= k; i++) f[u][i] = val[u]; + + // 枚举u的每一个子节点 + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v == fa) continue; // 如果是u的父亲,那么就跳过,保证只访问u的孩子 + // 先递归,// 递归填充v节点的信息 + dfs1(v, u); + // 再利用子节点信息更新父节点信息 + for (int j = 1; j <= k; j++) f[u][j] += f[v][j - 1]; + } +} +``` **3、换根$DP$** 这个题目本身是个无根树,如果我们认为规定编号为$1$的节点是根的话,那么对于祖宗节点$1$来说,$f[1][k]$就是距离$1$节点不超过距离$k$的节点的权值和。因为祖宗节点是没有父亲节点的,所以我们就不需要考虑沿着父节点方向的节点权值和。 -令:$g[u][k]$表示所有到$u$节点的不超过距离$k$的节点的权值和。根据刚刚的分析:$g[1][k]=f[1][k]$ +令:$g[u][j]$表示所有到$u$节点的不超过距离$j$的节点的权值和。根据刚刚的分析: +$$\large g[1][j]=f[1][j]\ j \in [1,k]$$ -这个就是我们换根$DP$的 **初始化**。其实受这个的启发,我们完全可以去把每个点都当作根,然后暴力跑出答案,但是这个暴力做法的时间复杂度是$O(n^2)$的,会超时。 +这个就是我们换根$DP$的 **初始化**。 +> **注**:我们完全可以去把每个点都当作根,然后暴力跑出答案,但是这个暴力做法的时间复杂度是$O(n^2)$的,会超时。 所以当我们将祖宗节点从节点$1$换为另一个节点的时候,我们只能通过数学上的关系来计算出$g$数组元素的值。这个也是换根$DP$的意义。 我们看下面的图: -![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401151316634.png) +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401151412377.png) 红色框是非常好理解的,以$v$为根的子树,在最远距离为$k$的限制下,写成$f[v][k]$。上面的部分,我们可以写成$g[u][k-1]$。因为到$v$不超过$k$的距离,即距离它的父亲节点不超过$k−1$的距离。 @@ -759,14 +745,101 @@ $$f[u][j]=val[u]+\sum_{v \in son[u]}f[v][j−1] \ j \in [1,k]$$ 所以最终的结果就是: $$\large g[v][k]=f[v][k]+g[u][k−1]−f[v][k−2]$$ +> **解释**: +> ① 换根$DP$时,由父推子,也就是用$g[u][?] \rightarrow g[v][??]$ +> ② 由于$v$需要向上,通过$u$去寻找点权和,而$v \rightarrow u$已经用去了$1$步,一共$k$步,现在就剩下了$k-1$步。 +> ③ $Q$:那为什么不是$f[u][k-1]$,而是$g[u][k-1]$呢? +> 因为$u$不光有向下的,还有向上的啊!我们现在不光要向下的,还要向上的,当然是$g[u][k-1]$啦! +> ④ 但是简单的这么整是不行的:$g[u][k-1]$与$f[v][k]$是存在交集的,如果简单加上就会造成一部分被算了两次!那么,是哪部分被算了两次呢? +> 答:对于$u$节点而言,$g[u][k-1]$与$f[v][k]$的交集,需要先走$1$步进入红框,这样,就用去了$1$步,也就是$f[v][k-2]$就是重复的部分,利用容斥原理去掉就行了,也就是$g[v][k]=f[v][k]+g[u][k−1]−f[v][k−2]$ + +细心的同学发现,这面的状态转移方程是有边界问题的:$k-2$是不是一定大于等于$0$呢? +如果$k-2<=0$咋办?会不会造成代码$RE$或者$WA$? -但是上述方程成立的条件是$k\geq 2$的。 +也就是说,上述方程成立的条件是$k\geq 2$的。 所以我们还得想一想$\leq 1$的时候。 -如果$k=0$,$g[u][0]$其实就是$val[u]$,因为不超过距离$0$的点只有本身。 +如果$k=0$,$g[v][0]$其实就是$val[v]$,因为不超过距离$0$的点只有本身。 + +如果$k=1$,那么$g[v][1]$其实就是$f[v][1]+val[u]$,因为沿着父节点方向距离$v$不超过$1$的点,只有父节点,而树中,父节点是唯一的。沿着子节点方向,其实就是$v$的各个子节点,而这些子节点可以统统用$f[v][1]$表示。 + +```cpp {.line-numbers} +#include +using namespace std; +const int N = 1e5 + 10, M = N << 1; +const int K = 25; +// 链式前向星 +int e[M], h[N], idx, w[M], ne[M]; +void add(int a, int b, int c = 0) { + e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; +} + +int f[N][K]; // f[i][j]:如果根是1号节点时,i号节点,最远走j步,可以获取到的所有点权和 +int g[N][K]; +int val[N]; // 点权数组 + +int n, k; -如果$k=1$,那么$g[u][1]$其实就是$f[u][1]+val[fa(u)]$,因为沿着父节点方向距离$u$不超过$1$的点,只有父节点,而树中,父节点是唯一的。沿着子节点方向,其实就是$u$的各个子节点,而这些子节点可以统统用$f[u][1]f[u][1]$表示。 +void dfs1(int u, int fa) { + // 初始化:当遍历到u节点时,u的拆分状态中,最起码包含了自己的点权值 + for (int i = 0; i <= k; i++) f[u][0] = val[u]; + + // 枚举u的每一个子节点 + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v == fa) continue; // 如果是u的父亲,那么就跳过,保证只访问u的孩子 + + // 递归,利用子更新父 + dfs1(v, u); // 递归填充v节点的信息 + // 在填充完子节点v的统计信息后,利用儿子们的填充信息,完成父亲节点信息的填充 + // for(j=1,j> n >> k; + for (int i = 1; i < n; i++) { // n-1条边 + int a, b; + cin >> a >> b; + add(a, b), add(b, a); + } + + for (int i = 1; i <= n; i++) cin >> val[i]; // 点权 + // 1、自底向上 + dfs1(1, 0); + + // 2、换根dp + for (int i = 0; i <= k; i++) g[1][i] = f[1][i]; + dfs2(1, 0); + + // 输出结果 + for (int i = 1; i <= n; i++) cout << g[i][k] << endl; + return 0; +} +``` #### [$P6419$ $Kamp$](https://www.luogu.com.cn/problem/P6419) https://www.cnblogs.com/Troverld/p/14601347.html