算法笔记 / A LEAF IN THE GARDEN
分层图
算法笔记 · 算法理论 / 图论。来自 Daily Learning 的学习笔记。
介绍
动态规划思想在图论中的一种应用。当有额外的状态维度(或约束条件)时,在每个状态下建一张图,并设计不同层间的转移关系。
- 层内边:同一个状态层内,在图节点之间转移
- 层间边:在不同状态层之间转移
可视化
实现
显式分层
数组多开一个层维度
struct Next{
int layer; // 层
int next; // 下一个节点
int weight; // 边权
};
// 邻接表
vector<vector<vector<Next>>> adj;
// 访问第 k 层上节点 u 的所有出边 v
for(auto &v: adj[k][u]){...}
层编码
第 层上节点 表示为 , 是每层节点数
struct Next{
int next; // 下一个节点
int weight; // 边权
};
// 邻接表
vector<vector<Next>> adj;
// 访问第 k 层上节点 u 的所有出边 v
for(auto &v: adj[u + k * n]){...}
应用
豁免边
可以在转移时将边权视为 最多 次,求最短路
- 第 层表示剩余 次豁免机会
- 对于路径 ,建立权值为 的边
- 在分层图上用最短路算法
多模式切换
可以在 种模式中切换,切换模式有额外权值
- 第 层表示第 种模式
- 对于节点 ,建立权值为 的边
逆向边
可以按有向边的反向转移最多 次
- 第 层表示剩余 次逆向转移机会
- 对于路径 (权值),建立权值为 的边
复杂度
- 点数:
- 边数: