递归实现的拓扑排序。

 

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] < 0return 0;                 //存在有向环
        else if(!c[v] && !dfs(v)) return 0;
    }
    c[u] = 1; topo[--t] = u;
    return 1;
}

int toposort()
{
    t = n;
    memset(c, 0sizeof(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)正在栈帧中,尚未返回)*/

 

posted on 2012-09-17 21:37  有间博客  阅读(621)  评论(0编辑  收藏  举报