bzoj3832

题意

\(n\)\(m\)条边的DAG,求删除一点后最长路径的最小值。

做法

\(f_i\)为以\(i\)结束的最长路径,\(g_i\)为以\(i\)出发的最长路径
用权值线段树维护这样一个集合:

  • 可重
  • 删除一个元素,若不存在这个元素则对集合没有影响

令拓扑序为\(a_i\),初始将\(g_i\)加入集合\(S\)
顺序遍历拓扑序\(x=a_i\)

  • \(f_u+g_x+1((u,x)\in E)\)\(S\)删除,将\(g_x\)\(S\)删除
  • 查询集合最大值更新答案
  • \(f_x+g_v+1((x,v)\in E)\)\(S\)加入

正确性:
不经过该点的路径存在于\(S\)
经过该点的路径不存在于\(S\):这条路径\(x\)前面每个点的贡献都被删掉了,后面的点只存在\(g_i\)的贡献

posted @ 2020-04-03 15:27  Grice  阅读(119)  评论(0)    收藏  举报