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;
    }
    
  • 相关阅读:
    join_tab计算代价
    outer join test
    突然觉得mysql优化器蛮简单
    将数据库字段从float修改为decimal
    小米初体验
    简述安装android开发环境
    Rust语言:安全地并发
    awk里的各种坑
    ubuntu下使用C语言开发一个cgi程序
    Ubuntu下安装和配置Apache2
  • 原文地址:https://www.cnblogs.com/Chuckqgz/p/5659229.html
Copyright © 2011-2022 走看看