首页 > 其他分享 >拓扑排序

拓扑排序

时间:2024-06-15 20:21:26浏览次数:9  
标签:输出 任务调度 int 拓扑 样例 任务 排序

7-13 任务调度的合理性

 

拓扑排序:

是对有向无环图的顶点的一种排序

在AOV网中,先找到一个没有入度的顶点,然后输出

从网中删除这个顶点和所有以它为起点的有向边

重复以上步骤直至当前AOV网为空或网中不存在无前驱的顶点为止(这是有环图)

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

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

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

输入格式:

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

输出格式:

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

输入样例1:

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:

1

输入样例2:

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

输出样例2:

0

 

#include<bits/stdc++.h>
using namespace std;
int n,k,d[110]={0},x;
vector<int>g[110];//这就是一个邻接表,用于表示图的关系,每个元素都是向量类型的对象
bool topo(){
    int ans=0;
    queue<int>q;
    for(int i=1;i<=n;i++){
         if(d[i]==0)
        q.push(i),ans++;//入度为0,能入队,ans+1
        }
    while(!q.empty()){
        int u=q.front();
        q.pop();//及时弹出才能利用q.front()查找入度为0的点的出度
        for(unsigned int i=0;i<g[u].size();i++){//这个g[u].size()是获取u的邻接节点出度数量,入度不是邻接节点
            int v=g[u][i];//节点u的邻接表中的第i个节点
            d[v]--;
            if(d[v]==0) q.push(v),ans++;
        }
    }
    if(ans==n)return 1;//说明都能一个接一个的入队,最终都可以入度为0,没有限制,故成功
    return 0;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){  //这个循环的目的是建一个图,之后拓扑判断这个图
        cin>>k;
        while(k--){
            cin>>x;
            g[x].push_back(i);//将节点i加入x的邻接列表,从x指向i
            d[i]++;
        }
    }
    cout<<topo();
    return 0;
}

 

标签:输出,任务调度,int,拓扑,样例,任务,排序
From: https://www.cnblogs.com/sly-345/p/18249687

相关文章

  • DreamJudge-1310-奥运排序问题(精华)
    1.题目描述TimeLimit:1000msMemoryLimit:256mb按要求,给国家进行排名。输入输出格式输入描述:有多组数据。第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。接下来一行给出M个国家号。输出描述:......
  • 快速排序
    #include<bits/stdc++.h>usingnamespacestd;voidhappy(inta[1000],intn,intm){inti=m,j=n,t=a[m];if(i>j)return;while(i!=j){while(a[j]>=t&&i<j){j--;}while(a[i]<=t&&......
  • DreamJudge-1248-整数奇偶排序
    1.题目描述TimeLimit:1000msMemoryLimit:256mb输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求:1.先输出其中的奇数,并按从大到小排列;2.然后输出其中的偶数,并按从小到大排列。输入输出格式输入描述:任意排序的10个整数(0~100),彼此以空格分隔。输......
  • DreamJudge-1227-日志排序(精华)
    1.题目介绍TimeLimit:1000msMemoryLimit:256mb有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:“hs_10000_p”是计算任务的名称,“2007-01-1719:22:53,315”是计算任务开始执行的时间“年-月-日时:分:秒,毫秒”,“253.035(s)”是......
  • DreamJudge-1217-国名排序
    1.题目描述TimeLimit:1000msMemoryLimit:256mb问题描述:小李在准备明天的广交会,明天有来自世界各国的客房跟他们谈生意,小李要尽快的整理出名单给经理,你能帮他把客户来自的国家按英文字典次序排好吗?例如小李手上有来自加拿大,美国,中国的名单,排好的名单应是美国,加拿......
  • DreamJudge-1159-成绩排序2.0
    1.题目描述TimeLimit:1000msMemoryLimit:32768mb用一维数组存储学号和成绩,然后,按成绩排序输出。输入输出格式输入描述:输入第一行包括一个整数N(1<=N<=100),代表学生的个数。接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。输出描述:按照学生的成......
  • 链式前向星和拓扑排序专题
    多日以来被图论狠狠的羞辱,下定决心学习图论基础链式前向星和拓扑排序图的存储方式邻接表规模大的稀疏图可用邻接表,存储复杂度为\(O(n+m)\)。n表示点的数量,m表示边的数量。structedge{ intfrom,to,w; edge(inta,intb,intc){ from=a;to=b;w=c; }}v......
  • 【十大排序算法】计数排序
    数字在轻舞纷飞中,依次排列,如星辰般闪耀。文章目录一、计数排序二、发展历史三、处理流程四、算法实现五、算法特性六、小结推荐阅读一、计数排序计数排序是一种非比较型的排序算法,它根据待排序元素的值来确定每个元素之前的有序位置。它的基本思想是统计待排序元素......
  • Python简单实现:读取文件夹并数字排序
    python中os.listdir()方法用于返回指定的文件夹包含的文件或文件夹的名字的列表importospath="../data/materials/test/"path_list=os.listdir(path)print(path_list)输出['1.jpg','10.jpg','11.jpg','12.jpg','13.jpg',......
  • C#中List的3种排序方法
    原文链接:https://blog.csdn.net/lwf3115841/article/details/130459042         https://blog.csdn.net/Pei_hua100/article/details/108072643ist是C#常用的数组,它较之前的ArryList更加灵活,解决了Arrylist会出现装箱和拆箱的不安全问题,它是一种动态数组,可以存......