// 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; }