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

    最近对拓扑排序概念有点模糊,故总结一下

    拓扑排序的定义:
    对于DAG的图G=(V,E),如果G有(u,v),则结点u排在v之前,以这样的次序排序,生成的图G所有顶点的线性次序叫拓扑排序

    拓扑排序的相关定理:[^参见《算法导论(第三版)》356页]

    • 一个有向图G=(V,E)是无环的,当且仅当对其进行DFS后不产生后向边。
    • 拓扑排序算法生成的是有向无环图的拓扑排序。

    拓扑排序的算法:
    对于一个从未访问的顶点u,对其执行深度优先搜索。
    深度优先搜索中:如果有环则退出,达到终点t则把t倒序放入答案数组中。

    代码:[^参见《算法竞赛入门经典(第二版)》168页]

    int c[maxn];
    int topo[maxn],t;
    bool dfs(int u){
        c[u]=-1;
        for (int v=0;v<n;v++) if (G[u][v]{
            if (c[v]<0) return false;    //此次dfs走过的结点标记为-1,如遇-1,说明有环,退出
            else if(!c[v] && !dfs(v)) return false; //若遍历没有走过的结点也失败了,那说明此次dfs也失败了
        }
        c[u]=1;topo[--t]=u;
        return true;
    }
    
    bool toposort(){
        t=n;
        memset(c,0,sizeof(c));
        for (int u=0;u<n;u++) if(!c[u])
            if (!dfs(u)) return false;
        return true;
    }
    
  • 相关阅读:
    如何保持页脚始终在页面底部
    CSS自适应宽度圆角按钮
    ACM1004
    java输出格式
    北大ACM1001题Exponentiation(求高精度幂)
    深入理解sizeof
    java之类BigDecimal
    ACM1003
    ACM1005
    C的输出格式printf
  • 原文地址:https://www.cnblogs.com/Chuckqgz/p/5659229.html
Copyright © 2011-2022 走看看