
状态设计
设 f(i) 表示遍历 i 的子树所需时间。
g(i) 表示遍历 i 的子树,且所有人都装好软件所需的最少时间。
贪心按照 g(i) − f(i) 从大到小的顺序遍历儿子即可。
需要注意的是转移的方程。应该这样写:
方程的注意点
for(int i=0;i<cnt;i++) f[u]=max(f[u],f[v]+g[u]+1),g[u]+=g[v]+2;
+1 是因为自己也要算进去.
参考代码
1 |
|

设 f(i) 表示遍历 i 的子树所需时间。
g(i) 表示遍历 i 的子树,且所有人都装好软件所需的最少时间。
贪心按照 g(i) − f(i) 从大到小的顺序遍历儿子即可。
需要注意的是转移的方程。应该这样写:
for(int i=0;i<cnt;i++) f[u]=max(f[u],f[v]+g[u]+1),g[u]+=g[v]+2;
+1 是因为自己也要算进去.
1 | #include <bits/stdc++.h> |