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

来源:互联网 发布:积分兑换系统源码 编辑:程序博客网 时间:2024/05/29 04:26

简单记录下 书中的方法:

建立一个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;}


0 0
原创粉丝点击