题意
(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)的贡献