摘要: int fa[maxn]; //dfs时的父亲 int dfn[maxn], idx; //访问的时间 int loop[maxn], cnt; //环 void get_loop(int u) { dfn[u] = ++ idx; for (int i = head[u];i;i=ed[i].nxt) { int v = ed[i].to; ... 阅读全文
posted @ 2019-07-30 14:18 Sirius-Judson 阅读(88) 评论(0) 推荐(0) 编辑
摘要: Luogu P3177 树形DP题 一开始真难想。 关键思路在于统计每条边的贡献。 设 f[u][j]表示以u为根的子树 有j个黑点,对答案的贡献。 递推式子比较好写:f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]+val) val=ed[i].w*(k*(m-k)+(s 阅读全文
posted @ 2019-07-30 11:34 Sirius-Judson 阅读(130) 评论(0) 推荐(1) 编辑
摘要: 背包是一种简单的DP,把它放在树上就不简单了。 树形背包初级的做法: 设f[i][j]是以i节点为根,体积为i的最大收益。 其实原来是f[u][i][j]表示以u为根,选取i个子树,体积为j的最大收益,但通过体积那一维的倒序循环(像01背包一样)可以在空间上优化为O(n^2),但时间上仍很庞大,为O 阅读全文
posted @ 2019-07-30 07:23 Sirius-Judson 阅读(222) 评论(0) 推荐(0) 编辑