算法笔记 / A LEAF IN THE GARDEN
最短路应用
算法笔记 · 算法理论 / 图论 / 最短路。来自 Daily Learning 的学习笔记。
差分约束
定义
一组形如约束条件形如 找出一组解,使得所有约束条件都成立。
解法
最短路三角形不等式
设 是从源点到 的最短距离,那么对于任意一条边 权值为 ,必有: 移项得到:
这恰好就是 的形式
建图
- 对不等式 ,连一条从 到 、权值为 的有向边。
- 求最短路径值 ,可作为不等式的一组解。
注意以下两点
- 如果有负环,说明约束条件矛盾,无解
- 如果图不连通,需要添加超级源点
传递闭包
定义
全局可达性问题,对于 个节点的图,传递闭包是一个 的矩阵 , 表示从点 是否能到达点 。
解法
把边权转换为“可达性”的布尔值,求全源最短路
- 有边设 1,无边设 0
- 使用 Floyd 算法求全源最短路
vector<vector<bool>> R;
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
R[i][j] |= (R[i][k] & R[k][j]);
优化
使用 bitset 优化,复杂度降为
vector<bitset<MAXN>> R;
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
if(R[i][k]) R[i] |= R[k];