任务调度的合理性 :
输入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;
}