拓扑排序

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

拓扑排序的定义:
对于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;
}

posted on 2016-07-11 09:33  Chuckqgz  阅读(...)  评论(...编辑  收藏

导航