例题 6-15 UVA 10305 Ordering Tasks 给任务排序

简单记录下 书中的方法:

建立一个c数组表示访问的状态,-1为正在访问,1表示访问完毕,0表示未访问。

G[u][v]表示u < v在输入中出现过。

然后遍历U,  对u进行dfs,dfs的方式是从1到n在来一遍,依次进行。

之所以数组倒着写,是因为输入的肯定是dfs最深的,最深的也是最大的,要放在面!

#include<cstdio>
#include<cstring>
const int maxn = 100 + 10;
int c[maxn],G[maxn][maxn],ans[maxn];
int n,m,t;
bool dfs(int u){
    c[u] = -1;// visiting
    for (int i = 1; i <= n; ++i){
        if (G[u][i]){
            if (c[i] == -1)return false;
            else if (!c[i] && !dfs(i))return false;
        }
    }
    c[u] = 1;ans[--t]=u;
    return true;
}
bool solve(){
    t = n;
    memset(c,0,sizeof(c));
    for (int i = 1; i <= n; ++i)if (!c[i])
        if (!dfs(i))return false;
    return true;
}
int main()
{
    while(scanf("%d%d",&n,&m) == 2 && (n || m)){
        int a,b;
        memset(G,0,sizeof(G));
        for (int i = 1; i <= m; ++i){
            scanf("%d%d",&a,&b);
            G[a][b] = 1;
        }
        solve();
        for (int i = 0;i < n; ++i)printf("%s%d",i?" ":"",ans[i]);
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(C语言,uva)