任务调度

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

 

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

using namespace std;

bool isScheduleValid(int N, vector<vector<int>>& dependencies) {
    vector<vector<int>> graph(N + 1); // 任务图的邻接表表示
    vector<int> inDegree(N + 1, 0); // 任务的入度

    // 构建任务图和入度计数
    for (int i = 0; i < dependencies.size(); i++) {
        int task = i + 1;
        vector<int>& dependency = dependencies[i];
        for (int j = 0; j < dependency.size(); j++) {
            int dependentTask = dependency[j];
            graph[dependentTask].push_back(task);
            inDegree[task]++;
        }
    }

    // 使用拓扑排序判断任务调度是否可行
    queue<int> q;
    for (int i = 1; i <= N; i++) {
        if (inDegree[i] == 0) {
            q.push(i);
        }
    }

    int count = 0; // 记录已经处理的任务数量

    while (!q.empty()) {
        int task = q.front();
        q.pop();
        count++;

        for (int i = 0; i < graph[task].size(); i++) {
            int dependentTask = graph[task][i];
            inDegree[dependentTask]--;
            if (inDegree[dependentTask] == 0) {
                q.push(dependentTask);
            }
        }
    }

    return count == N; // 如果处理的任务数量等于总任务数,则任务调度可行
}

int main() {
    int N;
    cin >> N;

    vector<vector<int>> dependencies(N);
    for (int i = 0; i < N; i++) {
        int K;
        cin >> K;
        vector<int> dependency(K);
        for (int j = 0; j < K; j++) {
            cin >> dependency[j];
        }
        dependencies[i] = dependency;
    }

    bool isValid = isScheduleValid(N, dependencies);
    cout << (isValid ? 1 : 0) << endl;

    return 0;
}
复制代码

 

posted @   周+⑦  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示