算法笔记--拓扑排序

算法笔记

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;
}
原文地址:https://www.cnblogs.com/widsom/p/7294926.html