zoukankan      html  css  js  c++  java
  • 算法笔记--拓扑排序

    算法笔记

    1.利用dfs对DAG拓扑排序

    当从某顶点v出发的DFS搜索完成时,v的所有后继顶点必定均已被访问过(想像它们均已被删除),此时的v相当于是无后继的顶点,因此在DFS算法返回之前输出顶点v即可得到 DAG的逆拓扑序列。

    模板(算法竞赛入门经典):

    int g[N][N];
    int vis[N];
    int topo[N];
    int t,n;
    
    bool dfs(int u)
    {
        vis[u]=-1;
        for(int v=0;v<n;v++)
        if(g[u][v])
        {
            if(vis[v]<0)return false;//存在有向环,失败退出
            else if(!vis[v]&&!dfs(v))return false;
        }
        vis[u]=1;
        topo[t--]=u;
        return true;
    }
    
    bool toposort()
    {
        t=n-1;
        mem(vis,0);
        for(int u=0;u<n;u++)
        if(!vis[u]&&!dfs(u))return false;
        return true;
    }

     2.队列实现拓扑排序,明显好理解

    以下是判环版

    bool topo_sort(int n){
        q.clear();
        int cnt=0;
        for(int i=1;i<=n;i++){
            if(tin[i]==0)cnt++,q.push(i);
        }
        while(!q.empty()){
            int u=q.front();
            q.pop();
            for(int v:g[u]){
                tin[v]--;
                if(tin[v]==0)cnt++,q.push(v);
            }
        }
        return cnt==n;
    }
  • 相关阅读:
    HASH算法介绍
    windowsOracle19C安装
    Oracle快照控制文件理解
    Swap空间扩展
    OracleDBA职责—备份与恢复技术—RMAN4
    OI回忆录
    HEOI2020(NEW)
    HEOI2020
    省选前奇怪的心情减少了
    $Mom$
  • 原文地址:https://www.cnblogs.com/widsom/p/7294926.html
Copyright © 2011-2022 走看看