拓扑排序 学习笔记

拓扑排序是一个 DAG 的所有顶点的线性序列,满足每个顶点出现且只出现一次和如果有一条 A 到 B 的路径,在序列中 A 出现在 B 的前面。

可以用一个类似 BFS 的方式(又叫 Kahn 算法)解决:

首先统计入度,如果一个点没有入边就加入队列,代表当前可以输出。

每次取出队首,删除这个点,把这个点出边连向的点度数减一,如果度数变成零就入队。当队列为空就结束。

int deg[n+5];
queue<int>q;
void topsort(int n,vector<int>e[]){
  for(int i=1;i<=n;i++)for(int j=0;j<e[i].size();j++)deg[e[i][j]]++;
  for(int i=1;i<=n;i++)if(!deg[i])q.push(i);
  while(!q.empty()){
    int now=q.front();
    q.pop()
    for(int i=0;i<e[now].size();i++)if(!--deg[e[now][i]])/*do something*/q.push(e[now][i]);
  }
}

时间复杂度 \(O(n+m)\)

拓扑排序主要用于在 DAG 上 dp 时去除后效性。只需要在枚举出边时转移即可(注释处)。

[[图论]]

posted @ 2024-03-01 09:38  lgh_2009  阅读(0)  评论(0编辑  收藏  举报