拓扑排序
递推型动态规划一般不能处理图的问题,因为图是没有拓扑序的。一个定点可能有多个入度或者多个出度,而缺少了动态规划必须的拓扑序。但是其实我们可以对图进行拓扑排序,找到这个图的拓扑序,然后再进行动态规划。
拓扑序仅在有向无环图里面出现,一个同样的图可能会有多个拓扑序。
基本思想
首先我们选取所有入度为 \(0\) 的顶点加入队列,然后进行 bfs。每次遍历邻点,并把这些点的入度减一。当入度为零时,加入拓扑序列。
void topo_sort() {
queue<int> q;
for (int i = 1; i <= n; i++) {
if (!d[i]) {
q.push(i), cout << i << ' ';
}
}
for (; q.size(); q.pop()) {
for (int i : e[q.front()]) {
if (!--deg[i]) {
q.push(i), cout << i << ' ';
}
}
}
}

浙公网安备 33010602011771号