一.简单的从下到上和从上到下的统计
1. dp[u]表示以u为根的一共有多少个节点.可以用来求重心.
2. 每个点出发能够走得最远的长度.dpm[u], dps[u]用来保存u为根到子树的最长距离,注意两者区别是不同的儿子(不想交路径).另外有一个f[u]指的是去掉u的儿子们之后,u可以发出的最长链.这样的是一个规范的从上往下的dp.我是这样定的:定状态f[u]要求不能考虑u的儿子,具体考虑不考虑u看题意.比如这个就要看u.那么我们的主要过程是已知u去推v.那么遍历u的儿子v,穿进去v的答案应该是1+非v的最长子树链和1+u的答案.
3. 把一棵树变成环.其实就是把一棵树先变成一个链,然后再加一条边变成环.而且变成环也好变.考虑u和v们,v首先需要变成链,但是每条链都有两个机会不用拆,并且要求v在v的链中也是链段.这样的话dp二维01,0带便随意,1代表强制根节点是一个链段.之后横着dp.
flag = 1;
f_2 = min(f_2 + dp[v][0] + 2, f_1+dp[v][1]);//v是不是一个//链端
if(f_2 > INF)
f_2 = INF;
f_1 = min(f_1 + dp[v][0] + 2, dp[v][1]+cnt*2+sum);//v是//不是一个链端
cnt++;
sum += dp[v][0];
多开一维来描述根的某种状态的方法很常用.本题是是否为链的一端.
(2)还有一题:不能选的点之间有相连的地方.开一维定义是否选根了.
(3)另外cf也有一道题,要求一颗子树上有且仅有一个黑色的点.那么多开一维来看这个u为根的子树是否有黑色的点.这样从<