通过率 48% · 提交 991 · 通过 479
小慕正在开发一个应用启动器,应用启动时需要执行多个初始化任务,这些任务之间存在。例如,任务A依赖任务B,意味着必须等任务B执行完成后,才能开始执行任务A。 现在小慕拿到了多条任务依赖规则,需要输出任务的执行顺序。规则采用:如果一个任务没有依赖任何其他任务,就立刻开始执行;如果同时有多个任务可以执行,则按照任务名称的字母顺序排序。 例如:任务B依赖任务A,任务C依赖任务A,任务D依赖任务B和任务C,同时任务D还依赖任务E。那么任务的执行顺序由先到后是:任务A,任务E,任务B,任务C,任务D。这里任务A和任务E都没有依赖,所以立即执行。
这类题属于华为 OD 机考真题方向中「200分 / 2024E」方向的高频题型,通常考察对「200分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入参数每个元素都表示任意两个任务之间的依赖关系,输入参数中符号->表示依赖方向,例A->B表示A依赖B,多个依赖之间用单个空格分割
输出为排序后的启动任务列表,多个任务之间用单个空格分割
示例 1
输入示例
B->A C->A D->B D->C D->E
输出示例
A E B C D
示例 2
输入示例
A->B C->B
输出示例
B A C
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
看到存在依赖关系,立马想到拓扑排序。
本题一个小难点在于如何对同级节点进行排序。
在 BFS 每一层搜索之前,可以构建一个空数组 nodes_new,来储存搜索过程中新出现的入度为 0 的节点。这些新出现的节点属于拓扑排序中的同级节点,需要在 for 循环结束后进行排序,然后加入到 ans 中。
代码如下:
思路展开 把「任务 A 依赖任务 B」看成图中一条从 B 指向 A 的边,问题就变成拓扑排序:入度为 0 的任务没有任何未完成的前置,可以立刻执行。代码用 neighbor_dic 存邻接表(key 是被依赖方 b,value 是依赖它的任务列表),用 indegree_dic 记每个任务的入度。初始答案 ans 取所有入度为 0 的节点并按字典序排序,同时作为 BFS 队列的第一层。之后逐层推进:弹出当前层的每个任务 cur_node,把它的每个后继 nxt_node 的入度减一,表示「又一个前置完成了」;入度降为 0 的后继收进临时列表 nodes_new 并入队。关键的一步是每层循环结束后,先对 nodes_new 按字典序排序再拼接到 ans 后面——同一层的任务是「同时变为可执行」的,题目规定这种情况按任务名称的字母顺序执行,逐层排序正好实现了这条贪婪规则。队列清空后,ans 就是完整的执行顺序。
复杂度分析 设任务(节点)总数为 V、依赖关系(边)数为 E。解析输入并构建邻接表与入度表为 O(E);拓扑排序主体中每个节点至多入队出队一次、每条边恰好使入度减一一次,为 O(V + E);排序方面,初始层与各层的 nodes_new 互不重叠,所有层排序的总代价不超过 O(V log V)。总时间复杂度 O(V log V + E),瓶颈在分层排序与遍历所有依赖边。空间上,邻接表与入度表共 O(V + E),队列和 ans 至多 O(V),空间复杂度 O(V + E)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
任务A和C都依赖于任务B。任务B执行后,A和C立即执行,A和C的执行顺序按照字典序排列。
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有