拓扑排序dfs写法

// c[u] == 0 表示从来没有访问过 (从来没有调用过dfs(u))
// c[u] == 1 表示已经访问过,并且还递归访问过它的所有子孙 (即dfs(u)曾经被调用过,并已经返回)
// c[u] == -1 表示正在访问 (即递归调用dfs(u)正在栈中,尚未返回)

int c[maxn];
int topo[maxn] ,t;
vector<int> g[maxn];

bool dfs (int u) {
    c[u] = -1;  // 访问标志
    for (int v : g[u]) {
        if (c[v] < 0) return false;  // 存在有向环,失败退出
        else if (!c[v] && !dfs(v)) return false;
    }
    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] && !dfs(u)) return false;
    return true;
}
原文地址:https://www.cnblogs.com/betaa/p/13354068.html