7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)

一:题目

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

比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务。有些课程可以同时开设,比如英语和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

二:思路分析

这个题把入度直接给你了,省得去求了,即第一列就是按顺序的某个结点的入度,如果有环的话肯定会有结点的入度不会为0;

三:上码

//拓扑排序 如果存在环则不能输出正常序列
#include<stdio.h>
void topology(int N){
   int i,j,k,m,b[105],count=0;
   int Indegree[105]={0};//入度初始化为0 
   int Queue[105],head=0,last=0;
   int c[105][105];//创建二维数组 将有到达这个顶点的 顶点存进去
   for(i = 1; i<=N; i++){
       scanf("%d",&k);
       Indegree[i] = k;//将其入度存进去了
       for(j=0; j<k; j++){
          scanf("%d",&c[i][j]);
        }
   }

   for(i = 1; i<=N; i++){
       if(Indegree[i] == 0)
         Queue[last++]=i;
   }

   while(head - last){
      m = Queue[head++];//出队 将入度为0的出队
      count++;
      //顶点度数开始减一 为0 入队
      for(i=1; i<=N; i++){
          for(j=0; j<105; j++){
              if(c[i][j] == m){
                  Indegree[i]--;
                  if(Indegree[i] == 0)
                    Queue[last++] = i;
              }
          }
      }

   }

   if(count == N ){
       printf("1");
   }
   else
       printf("0");
}
int main(){
    int N;
    scanf("%d",&N);
    topology(N);
}

在这里插入图片描述

四:补充:

如果兄弟们觉得这道题入度给了,自己不用求,觉得不过瘾的话,我这还有码,是求拓扑序列,当然也能判断是否有环和无环

/* 
	1.
		AOV网(Activity On Vertex Network)【顶点——表示活动】
		是一个——有向无回路的图
		顶点——表示活动
		用弧——表示活动间的优先关系的有向图称为-顶点表示活动的网
		即如果a->b,那么a是b的先决条件
		求拓扑序列就是AOV
	2.
		用邻接矩阵存储时 每一列表示这个顶点的入度(有向图中)	
*/
#include<bits/stdc++.h>
using namespace std;

typedef struct GNode* PtrGraph;
typedef struct GNode{
	int Nv;
	int Ne;
	int Date[100][100];
}gnode;

int cnt; //统计每个结点的入度 
vector<int>v;//存入度的 
vector<int>v1;//记录拓扑序列 

//创建图
void creatrGraph(PtrGraph G){
	int N,M;
	cin >> N >> M;
	G->Nv = N;
	G->Ne = M;
	
	//矩阵初始化
	for( int i = 0; i < G->Nv; i++ ){
		for(int j = 0; j < G->Nv; j++ ){
			G->Date[i][j] = 0;
		}
	} 
	 
	//矩阵赋值
	for(int i = 0; i < G->Ne; i++ )
	{
		int a,b;
		cin >> a >> b;
		
		G->Date[a][b] = 1;//有向图	
	} 	
} 
//求取每一列的数据和即为该顶点的入度
void degree(PtrGraph G){
	
	for(int j = 0; j < G->Nv; j++ ){
	
		cnt = 0;
	
		for( int i = 0; i < G->Nv; i++ ){
			if(G->Date[i][j] == 1)
			 cnt++;
		}
	    
	    v.push_back(cnt);
	}
}  
//求拓扑序列

void topology( PtrGraph G ){
	
	queue<int>q;
	int count = 0;//用于计算度数为0的结点的个数 
	
	for( int i = 0; i < G->Nv; i++ )
	{
		if(v[i] == 0)
		q.push(i);//将入度为0的入队		
	} 
		
	//这里就是处理每次去掉一个度数为0的点和其有关系的顶点度数减一 
	while( !q.empty() ){
		
		int temp = q.front();
		q.pop();
		
        v1.push_back(temp); 
		
		count++;
		
		for( int j = 0; j < G->Nv; j++ ){//列 
			
			if( G->Date[temp][j] == 1  ){//在 temp 这一行中 等于 1的 j 需要入度减一 	
				v[j]--;//其入度减一
				
				if( v[j] == 0 ){
				q.push(j);// 将入度为0的入度 
			}
					 	
			}
		}
	} 
	
	if( G->Nv  == count ){//没有环 
		for( int i = 0; i < v1.size(); i++ )
          	cout << v1[i] << ' '; 	
	}else{
		cout << "此图有环"; 
	} 
	
	
} 


int main(){
	
	PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));
	creatrGraph(G);
	degree(G);
	topology(G);

	
} 


//5 6
//0 1
//0 2
//1 3
//2 1
//2 4
//3 4
//拓扑序列: 0 2 1 3 4

在这里插入图片描述

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 任务调度合理性是指在任务执行的过程中,根据任务的优先级、紧急程度、资源需求等因素,合理地安排任务的执行顺序和时间,以达到最优的执行效果。合理的任务调度可以提高系统的效率和稳性,减少资源的浪费和冲突,提高任务的执行质量和效率。同时,合理的任务调度还可以提高系统的可靠性和可维护性,降低系统的故障率和维护成本。因此,任务调度合理性对于系统的正常运行和发展至关重要。 ### 回答2: 任务调度合理性是指,在多个任务需要同时执行时,如何合理地配和调度它们的执行顺序和资源配,以便实现最优的执行效率和资源利用率。 首先,任务调度合理性可以提高系统的效率和资源利用率。在多任务系统中,当任务数量超过系统的处理能力时,任务调度可以合理配处理器和其他资源,使得系统的处理能力能够得到最大化的利用,从而提高系统的效率和资源利用率。 其次,任务调度合理性还可以减少系统的响应时间和延迟。当系统中有大量的任务需要处理时,任务调度可以根据任务的优先级和紧急程度来合理配处理时间,使得系统对高优先级的任务能够及时响应,并在最短时间内完成。 此外,任务调度合理性也可以提高系统的可靠性和安全性。通过对任务的调度和资源配进行科学合理的规划和设计,能够有效避免资源争用和死锁等问题,保证系统的稳性和可靠性,同时也能够保障系统的安全性。 综上所述,任务调度合理性是多任务系统中非常重要的一个方面。通过合理的任务调度和资源配,可以最大程度地提高系统的效率和资源利用率,降低系统的响应时间和延迟,同时还可以保证系统的可靠性,安全性和稳性,从而实现系统的高效运行。 ### 回答3: 任务调度是指操作系统对计算机中各个任务进行合理的配和调度,优化系统资源的利用,提高计算机系统的效率和性能。在实际应用中,任务调度可以为多类,其中包括进程调度、作业调度、实时调度等等。在这些调度过程中,一个重要的问题是如何将任务合理地配给计算机系统的资源,以便最大化地利用系统的性能。 7-5任务调度合理性,是指任务调度与目标之间的联系是否相符。任务调度应当遵循任务的性质,确任务的优先级,按照优先级高低或特的调度算法来决任务的执行顺序,以达到最优的系统性能。同时,任务调度也需要及时响应用户的请求,减少系统的延迟和响应时间,保证系统的实时性和可靠性。 任务调度合理性还需要考虑计算机系统的硬件资源和软件资源,包括CPU、内存、硬盘、网络带宽等等。在任务配和调度过程中,应考虑这些资源的使用情况和负载情况,避免资源的浪费和过度使用,保护系统的健康和稳任务调度合理性对于计算机系统的性能和效率至关重要,它可以使计算机系统在繁忙的工作环境下高效地工作,避免系统出现过度负载或资源浪费的情况。合理的任务调度可以减少系统的延迟和响应时间,提高用户的交互体验和满意度,同时也可以减少系统的能耗和成本,保护环境和资源。 总之,任务调度合理性对于计算机系统的性能和效率有着至关重要的作用。在实际应用中,任务调度应遵循任务性质、优先级等因素,同时考虑计算机系统的硬件和软件资源负载情况,以达到最优的系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值