• Uva10305 Ordering Tasks


    John有n个任务,但是有些任务需要在做完另外一些任务后才能做。

    输入

    输入有多组数据,每组数据第一行有两个整数1 <= n <= 100 和 mn是任务个数(标记为1n),m两个任务直接关系的数量。在此之后,有m行,每行有2个整数ij,代表任务i必须在任务j之前完成。用n = m = 0结束整个输入。

    输出

    每一个数据对应一行n个整数,代表任务完成的顺序。

    样例输入

    	5 4
    	1 2
    	2 3
    	1 3
    	1 5
    	0 0

    样例输出

    	1 4 2 5 3
    分析:这就是一道模板题吧,用dfs版本处理比较好输出.
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    const int maxn = 220;
    int n,ans[maxn],t,m,head[maxn],to[maxn],flag[maxn],nextt[maxn],tot = 1;
    
    void add(int x,int y)
    {
        to[tot] = y;
        nextt[tot] = head[x];
        head[x] = tot++;
    }
    
    void dfs(int u)
    {
        flag[u] = 1;
        for (int i = head[u]; i; i = nextt[i])
        {
            int v = to[i];
            if (!flag[v])
            dfs(v);
        }
        ans[t--] = u;
    }
    
    void solve()
    {
        memset(flag,0,sizeof(flag));
        t = n;
        for (int i = 1; i <= n; i++)
        if (!flag[i])
        dfs(i);
    }
    
    int main()
    {
        while (scanf("%d%d",&n,&m) == 2 && (n || m))
        {
            tot = 1;
            memset(head,0,sizeof(head));
            for (int i = 1; i <= m; i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                add(u,v);
            }
            solve();
            for (int i = 1; i <= n; i++)
            {
                if (i != n)
                printf("%d ",ans[i]);
                else
                printf("%d",ans[i]);
            }
            printf("
    ");
        }
    
        return 0;
    }
     
  • 相关阅读:
    [转] egg(28)--mongoose使用聚合管道
    [转] mongoose的populate
    [转]express常用中间件
    [转] SuperAgent使用文档
    [转] node爬虫之gbk网页中文乱码解决方案
    [转] js日期对象Date对象方法 时间方法
    [转] Nodejs学习笔记(十四)— Mongoose介绍和入门
    [转] 深入理解vue 一些底层原理
    [转] Nginx之八 URL重写(rewrite)配置
    随笔
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7580147.html
Copyright © 2020-2023  润新知