拓扑排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 91

int v[MAXN], n, t, q[MAXN], G[MAXN][MAXN];

int dfs(int i){
    v[i] = -1;
    int j;
    for(j=1; j<=n; j++) if(G[i][j]){
        if(v[j]<0) return 0;    //发现环
        if(!v[j] && !dfs(j)) return 0;
    }
    q[t--] = i; v[i] = 1;   //加到当前拓扑排序的首部
    return 1;
}

int toposort(){
    t = n;
    int u;
    memset(v, 0, sizeof(v));
    for(u=1; u<=n; u++) if(!v[u]){
        if(!dfs(u)) return 0;
    }
    return 1;
}

int main(){
    freopen("d:\\my.txt", "r", stdin);
    int m, i;
    scanf("%d %d", &n, &m);
    memset(G, 0, sizeof(G));
    for(i=1; i<=m; i++){
        int a, b;
        scanf("%d %d", &a, &b);
        G[a][b] = 1;
    }
    toposort();
    for(i=1; i<=n; i++){
        if(i != n) printf("%d ", q[i]);
        else printf("%d\n", q[i]);
    }

    return 0;
}

 

posted on 2013-02-14 13:12  Still_Raining  阅读(176)  评论(0编辑  收藏  举报