拓扑排序练习题:任务安排顺序(Kahn)


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 4M

Author:
Problem type
Allowed languages
C, C++

🧠 拓扑排序练习题:任务安排顺序(Kahn)

📖 题目描述

某公司有 \(n\) 个任务要完成,编号为 \(0\) 到 \(n - 1\)。由于任务之间存在依赖关系,必须先完成某些任务后,才能开始另一些任务。

现在给出 \(m\) 条任务依赖关系,每条依赖关系为一对整数 \([a, b]\),表示:任务 \(b\) 依赖于任务 \(a\),即 必须先完成任务 \(a\),才能进行任务 \(b\)

请你输出一种可行的任务执行顺序,使得所有依赖关系都被满足。如果存在多个合法的顺序,输出任意一种即可。如果无法完成所有任务(即依赖关系中存在环),输出 IMPOSSIBLE。


🧾 输入格式

  • 第一行:两个整数 \(n\) 和 \(m\)(\(1 \le n \le 10^4\), \(0 \le m \le 2 * 10^4\))
  • 接下来的 \(m\) 行:每行两个整数 \(a\) 和 \(b\),表示任务 \(a\) 依赖于任务 \(b\)

📤 输出格式

  • 如果存在合法的任务执行顺序,输出一行包含 \(n\) 个整数,表示任务的执行顺序(用空格分隔);
  • 如果不存在合法顺序(存在环),输出:IMPOSSIBLE

💡 示例 1

输入:

4 4
1 0
2 0
3 1
3 2

输出:

0 1 2 3

解释:任务 1 和 2 必须在任务 0 完成后执行,任务 3 必须等 1 和 2 都完成后执行。合法顺序有多种,比如:\(0 2 1 3\) 也是合法的。


💡 示例 2

输入:

3 3
0 1
1 2
2 0

输出:

IMPOSSIBLE

解释:任务之间形成了一个环,无法安排顺序。


✅ 说明

该问题的本质是对一个有向图进行 拓扑排序

  • 如果图是一个 DAG(有向无环图),则存在拓扑序;
  • 如果图中存在环,则无法完成所有任务。

🧠 提示

  • 建议使用 Kahn 算法(入度法)
  • 本题与 LeetCode 经典题目 Course Schedule II 类似;
  • 输出任意一个符合条件的拓扑序即可,无需唯一。

Comments

There are no comments at the moment.