拓扑排序

来源:互联网 发布:淘宝客服挂起 编辑:程序博客网 时间:2024/05/18 10:42

参见ural 1022

#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 10010int N, cnt, e, first[MAXD], next[MAXM], v[MAXM], topo[MAXD], vis[MAXD];void add(int x, int y){    v[e] = y;    next[e] = first[x], first[x] = e ++;}void init(){    int i, j, k;    memset(first, -1, sizeof(first));    e = 0;    for(i = 1; i <= N; i ++) //输入每个节点的后代,以0结束        for(;;)        {            scanf("%d", &k);            if(k == 0)                break;            add(i, k);        }}void dfs(int cur){    int i;    vis[cur] = 1;    for(i = first[cur]; i != -1; i = next[i])        if(!vis[v[i]])            dfs(v[i]);    topo[-- cnt] = cur;}void solve(){    int i, j, k;    cnt = N;    for(i = 1; i <= N; i ++)        if(!vis[i])            dfs(i);    printf("%d", topo[0]);    for(i = 1; i < N; i ++)        printf(" %d", topo[i]);    printf("\n");}int main(){    while(scanf("%d", &N) == 1)    {        init();        solve();    }    return 0;}


原创粉丝点击