有一个 n 个点的带权有向图,刚开始:
- ∀1≤i<n 存在边 i→i+1,边权为 0,这些边不可删除;
- ∀1≤i<j≤n,存在边 i→j,边权为 −1;
- ∀1≤i<j≤n,存在边 j→i,边权为 1;
给定 n×n 的正整数矩阵 A,删除可删除的 i→j 的有向边的代价为 Ai,j,求最小的代价使得图中不存在负环。
1≤n≤500。
做法 1
性质
对于一条 x→y 的负边,若其最后没有删除,则显然 ∀i≤x,y≤j 的负边 i→j 都不会被删除。
所以最终负边肯定形如:
- 将序列划分为若干个区间和一些孤立点;
- 一个区间中的点向后面区间中的所有点连负边,孤立点不连负边;
然后正边就不能跨越一整个区间。
那么不难发现将孤立点并入旁边的某个区间是不劣的,因为这不会影响正边的连法,还会减少删边的代价。
所以直接设 fi,j 表示考虑了前 i 个点,上一个区间是 [j,i] 的最小代价,转移直接考虑枚举下一个区间 [i+1,r] 然后用前缀和计算代价即可。
复杂度 O(n3)。
做法 2
性质
一个从 1 可以到达任意点的图不存在负环,当且仅当存在从 1 到任意点 i 的最短路 di 存在。
那么考虑 di 的限制:
- di≥di+1,这是因为存在边权为 0 的边 i→i+1;
- 对于一条负边 i→j,di−1≥dj;
- 对于一条正边 j→i,di≤dj+1;
那么划分出若干个区间满足内部的 d 相等,则后面部分和第一个做法一样了。
复杂度 O(n3)。