递归实现的拓扑排序。
const int MAXN = 510;
int c[MAXN];
int topo[MAXN], t;
int G[MAXN][MAXN];
int n, m;
int dfs(int u)
{
c[u] = -1;
for(int v = 0; v < n; v++) if(G[u][v])
{
if(c[v] < 0) return 0; //存在有向环
else if(!c[v] && !dfs(v)) return 0;
}
c[u] = 1; topo[--t] = u;
return 1;
}
int toposort()
{
t = n;
memset(c, 0, sizeof(c));
for(int u = 0; u < n; u++) if(!c[u])
if(!dfs(u)) return 0;
return 1;
}
int c[MAXN];
int topo[MAXN], t;
int G[MAXN][MAXN];
int n, m;
int dfs(int u)
{
c[u] = -1;
for(int v = 0; v < n; v++) if(G[u][v])
{
if(c[v] < 0) return 0; //存在有向环
else if(!c[v] && !dfs(v)) return 0;
}
c[u] = 1; topo[--t] = u;
return 1;
}
int toposort()
{
t = n;
memset(c, 0, sizeof(c));
for(int u = 0; u < n; u++) if(!c[u])
if(!dfs(u)) return 0;
return 1;
}
/*这里用到了一个c数组,c[u] = 0表示从来没有访问过(从来没有调用过dfs(u));c[u] = 1表示已经访问过,并且还递归访问过它的所有子孙;c[u] = -1表示正在访问(即递归调用dfs(u)正在栈帧中,尚未返回)*/