任务调度的合理性 :

任务调度的合理性 :

在这里插入图片描述
输入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

分析题目:

//可以转化为有向图的问题
//输入第一行给出子任务数N —— 代表顶点数,顶点编号设置为 1-n
//随后N行:表示编号1-n的依赖集,(m,1…m) m:表示依赖集的个数,1…m:表示依赖集的编号
//输出为0的情况:即能构成有向连通图

定义一个vector t[100 + 1];
由于子任务按1~N编号,所以t[i],i代表编号
t[i]后面跟着的实体,表示改编号的依赖集,t[i].size()+1表示顶点i的依赖集的元素的个数
定义vis[101] ,设置初值为0,当vis[i]=1时,表示访问过i顶点
定义方法hasC(int i),充分利用vector t[100 + 1]和vis[i],具体看代码分析
倘若vis[i]!=0了,则说明是第二次遍历该编号,则为通路,则输出0

#include <iostream>
#include <vector>
using namespace std;
 
int N;
vector <int> t[100 + 1];//定义了一个容器的对象叫做t[i],可以放int实体
int vis[101] = {0};
int flag = 1;
int hasC(int i) {
	for (int j = 0; j < t[i].size(); j++) {//j < t[i].size()逐个遍历t[i]后面放的实体
		if (vis[t[i][j]] == 0) {
			vis[t[i][j]] = 1;//表示访问过后面的实体,即依赖数
			return hasC(t[i][j]);
		} else {//若不为0,表示二次访问,即存在通路,返回0
			flag = 0;
		}	
	}
	return flag;
}
int main(int argc, char** argv) {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		int k;
		cin >> k;
		for (int j = 0; j < k; j++) {
			int num;
			cin >> num;
			t[i].push_back(num);//将依赖的int数放在t[i]后面
		}
	}
	for (int i = 1; i <= N; i++) {//从顶点1开始
		fill(vis + 1, vis + N + 1, 0);//将vis填充为0
		if (!hasC(i)) {
			flag = 0;
			break;
		}
	}
	cout << flag;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值