zoukankan      html  css  js  c++  java
  • 拓扑排序

    什么是拓扑排序呢?他又是用来干嘛的?

    生活中,我们经常面临这样的情况:几件事情之间有相互依赖关系,必须其中的几件发生,某件才能发生。我们可以用有向无环图来表示这种关系,一个点指向另一个点代表该点要先于另一点。注意一定是没有环的,否则就进入了无休止的死循环。。。

    这样,每个点的入度代表该点先前的点数,任意时刻入度为0的点就是可以访问的点。每次访问一点并将其从图中删除,对应的点入度减1,不断重复这个过程,知道所有的点都被遍历,这就叫拓扑排序。特别的,点的访问顺序叫做拓扑序,一个DAG可能有多个拓扑序。

     1 int ans[maxn],cnt;
     2 queue<int> q; //队列用于存放入度为0的点
     3 struct edge { //邻接表存储图
     4     int v,next;
     5 } E[maxm];
     6 void topo_sort() {
     7     for(int i=1;i<=n;++i) if(!ind[i]) q.push(i); //先将入度为0的点入队
     8     while(!q.empty()) {
     9         int u=q.front();q.pop();
    10         ans[++cnt]=u; //记录拓扑序,通过cnt是否等于n还可判断是否存在拓扑序
    11         for(int p=head[u];p+1;p=E[p].next) //删边,该点指向的点的入度减1,同时将新的入度为0的点入队
    12             if(!(--ind[E[p].v])) q.push(E[p].v);
    13     }
    14 }
  • 相关阅读:
    移动端 滑动框架
    汇编学习笔记48
    走进C#,走进linq
    汇编学习笔记之终结
    汇编学习笔记47
    汇编学习笔记46
    汇编学习笔记51(剧终)
    汇编学习笔记45
    汇编学习笔记50
    汇编学习笔记44
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9580334.html
Copyright © 2011-2022 走看看