Ordering Tasks

这个拓扑算法,就是注意顺序,因为自己还没怎么看懂,之后会进行补充和修改,然后表示完全不知道字典序的问题,最开始题目都读不懂,所以我也没啥好说的,直接借鉴了书上的代码什么的。

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<math.h>  
#define max 100+5  
int c[max],topo[max],t,n,G[max][max];  
int dfs(int u)  
{  
    int v;  
    c[u] = -1;  
    for(v = 1; 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()  
{  
    int i;  
    t = n;  
    memset(c,0,sizeof(c));  
    for(i = 1; i <= n; i++)  
        if(!c[i] && !dfs(i))  
                return 0;  
    return  1;  
}  
int main()  
{  
#ifdef state  
    freopen("sample.txt","r",stdin);  
#endif  
    int m,i;  
    while(scanf("%d%d",&n,&m),n || m)  
    {  
        int u,v;  
        memset(G,0,sizeof(G));  
        for(i = 0 ; i < m ; i++)  
        {  
            scanf("%d%d",&u,&v);  
            G[u][v] = 1;  
        }  
        if(toposort())  
        {  
            for(i = 0; i < n-1; i++)  
                printf("%d ",topo[i]);  
            printf("%d
",topo[i]);  
        }  
    }  
    return 0;  
}

  

原文地址:https://www.cnblogs.com/yintoki/p/5693069.html