拓扑排序

递推型动态规划一般不能处理图的问题,因为图是没有拓扑序的。一个定点可能有多个入度或者多个出度,而缺少了动态规划必须的拓扑序。但是其实我们可以对图进行拓扑排序,找到这个图的拓扑序,然后再进行动态规划。

拓扑序仅在有向无环图里面出现,一个同样的图可能会有多个拓扑序。

基本思想

首先我们选取所有入度为 \(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 << ' ';
      }
    }
  }
}
posted @ 2023-10-15 15:57  haokee  阅读(22)  评论(0)    收藏  举报