zoukankan      html  css  js  c++  java
  • 任务调度的合理性 (25)拓扑排序

    假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行。“任务调度”包括一组子任务、以及每个子任务可以执行所依赖的子任务集。

    比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务。有些课程可以同时开设,比如英语和C程序设计,它们没有必须先修哪门的约束;有些课程则不可以同时开设,因为它们有先后的依赖关系,比如C程序设计和数据结构两门课,必须先学习前者。

    但是需要注意的是,对一组子任务,并不是任意的任务调度都是一个可行的方案。比如方案中存在“子任务A依赖于子任务B,子任务B依赖于子任务C,子任务C又依赖于子任务A”,那么这三个任务哪个都不能先执行,这就是一个不可行的方案。你现在的工作是写程序判定任何一个给定的任务调度是否可行。

    输入格式说明:

    输入说明:输入第1行给出子任务数N(<=100),子任务按1~N编号。随后N行,每行给出一个子任务的依赖集合:首先给出依赖集合中的子任务数K,随后给出K个子任务编号,整数之间都用空格分隔。

    输出格式说明:

    如果方案可行,则输出1,否则输出0。

    样例输入与输出:

    样例输入与输出:

    序号 输入 输出
    1
    4
    0
    1 1
    1 1
    2 2 3
    
    1
    
    2
    12
    0
    0
    2 1 2
    0
    1 4
    1 5
    2 3 6
    1 3
    2 7 8
    1 7
    1 10
    1 7
    
    1
    
    3
    4
    1 4
    2 1 4
    1 2
    1 3
    
    0

    PS:

    用拓扑排序,如有节点不能被删除则有环!

    #include <cstdio>  
    #include <cstring>  
    #define MAXN 517  
    int G[MAXN][MAXN];//路径  
    int in_degree[MAXN];//入度  
    int ans[MAXN];  
    int n, m, x, y;  
    int i, j;  
    int flag = 0;  
    void toposort()  
    {  
        flag = 0;  
        for(i = 1; i <= n; i++)  
        {  
            for(j = 1; j <= n; j++)  
            {  
                if(G[i][j])  
                {  
                    in_degree[j]++;  
                }  
            }  
        }  
        for(i = 1; i <= n; i++)//从最小的开始寻找,  
        {  
            //这样保证了有多个答案时序号小的先输出  
            int k = 1;  
            while(in_degree[k] != 0)//寻找入度为零的点  
            {  
                k++;  
                if(k > n)  
                {  
                    flag = 1;  
                    break;  
                }  
            }  
      
            ans[i] = k;  
            in_degree[k] = -1;  
            //更新为-1,后边检测不受影响,相当于删除节点  
            for(int j = 1; j <= n; j++)  
            {  
                if(G[k][j])  
                    in_degree[j]--;//相关联的入度减1  
            }  
        }  
    }  
      
    void init()  
    {  
        memset(in_degree,0,sizeof(in_degree));  
        memset(ans,0,sizeof(ans));  
        memset(G,0,sizeof(G));  
    }  
      
    int main()  
    {  
        while(~scanf("%d",&n))  
        {  
            init();  
            for(i = 1; i <= n; i++)  
            {  
                scanf("%d",&m);  
                for(int j = 0; j < m; j++)  
                {  
                    scanf("%d",&y);  
                    G[i][y] = 1;  
                }  
            }  
            toposort();  
            if(flag)  
            {  
                printf("0
    ");  
            }  
            else  
                printf("1
    ");  
        }  
        return 0;  
    }  
  • 相关阅读:
    win 8升级win8.1的几个问题
    使用ghost硬盘对拷备份系统
    在odl中怎样实现rpc
    ASP.NET常见内置对象(一)
    [Xcode 实际操作]六、媒体与动画-(12)检测UIView动画的结束事件:反转动画并缩小至不可见状态
    [Xcode 实际操作]六、媒体与动画-(11)UIView视图卷曲动画的制作
    [Xcode 实际操作]六、媒体与动画-(10)UIView视图翻转动的画制作
    [Xcode 实际操作]六、媒体与动画-(9)使用CATransaction Push制作入场动画
    [Xcode 实际操作]六、媒体与动画-(8)使用CATransaction Reveal制作渐显动画
    [Xcode 实际操作]六、媒体与动画-(7)遍历系统提供的所有滤镜
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8544464.html
Copyright © 2011-2022 走看看