拓扑排序和DAG的一些心得

参考下面这个链接,有一些资源
toposort
https://oi-wiki.org/graph/dag/
Directed Acyclic Graph (有向无环图)

能拓扑排序肯定是DAG

然后就能用DP做很多事情:
1、DP 求最长(短)路

拓扑排序 + 动态规划,类似于 Dijkstra,但更快

dist[v] = max(dist[v], dist[u] + w);
dist[v] = min(dist[v], dist[u] + w);

2、有多少条不同的路径?
设 cnt[i] 表示从起点(如点1)到点 i 的路径条数。
初始时:cnt[1] = 1(起点到自身有一条路径),其它为 0。

cnt[v] += cnt[u];

这样遍历所有点后,就能知道从起点到终点的路径总数。

3、 路径中的最小/最大边数

min_edge[v] = min(min_edge[v], min_edge[u] + 1);

在基本Dijkstra的基础上进行扩展应用或改造
dij跑完之后,会生成 最短路径组成的 DAG(Shortest Path DAG)。
https://chatgpt.com/c/6811d9f1-5d98-800f-8790-406999984abc
变成DAG之后,就能用各种DP了

比如下图就是计算出从 1 开始的最短路径后的DAG:
image

然后我们就能用DP统计从 1 到 5 最短路数量

image

posted @ 2025-04-30 16:39  katago  阅读(21)  评论(0)    收藏  举报