1 solutions
-
0
题目大意
给定若干条指令(最多 100 条),每条指令可能依赖于其他指令。指令之间的依赖关系用 PRO-CON 关系表示,其中 PRO 表示生产者指令,CON 表示消费者指令,依赖的延迟时间(latency)也随之给出。任务是计算每条指令的优先级,并根据优先级进行排序
题目思路
这道题主要涉及 拓扑排序 和 动态规划 的结合应用。具体步骤如下:
1.建立图模型:
将每条指令看作图中的一个节点。 PRO-CON 关系看作有向边,从 PRO 指令指向 CON 指令。 每条边带有一个权重,表示延时。
2.拓扑排序:
由于指令依赖关系形成了一个有向无环图(DAG),可以对图进行拓扑排序。 拓扑排序的目的是确保所有指令按照依赖关系的顺序执行。
3.动态规划计算优先级:
初始化每条指令的 优先级 为 0。 按照拓扑排序的顺序处理每个节点: 对于每个 CON 指令,根据其所有 PRO 指令的 优先级 和延时,更新其 优先级 为所有可能值中的最大值。 具体地,对于每条边 u -> v,更新 PRIORITY(v) = max(PRIORITY(v), PRIORITY(u) + L)。 4.排序指令:
根据计算得到的 优先级 对指令进行排序。 优先级高的指令排在前面。 如果优先级相同,则编号小的指令排在前面。
整道题可以说是DAG动态规划的板子题,也是拓扑排序的板子题。不理解的话可以去搜索一下复习一下。
代码说明
代码整体流程
1.输入读取:
从标准输入读取指令的数量 n(总指令数)和关系的数量 m(依赖关系数)。接着,读取接下来的 m 行,每行的格式为 (u, v, latency),表示指令 u 依赖于指令 v,并且有一定的延迟时间。
2.初始化变量:
创建一个邻接表或动态数组 edge,用于存储每条指令的依赖关系。初始化一个数组 ans,用于记录每条指令的优先级和对应的编号。还需要一个数组 in,用于记录每个指令的入度,表示有多少条指令依赖于该指令。
3.构建图:
遍历输入的依赖关系,更新邻接表,记录每条指令的消费者和对应的延迟。同时更新入度数组,记录每条指令被多少其他指令依赖。
4.拓扑排序:
使用队列实现拓扑排序,将所有入度为 0 的指令入队,并初始化这些指令的优先级为 0。接下来,进行广度优先搜索(BFS),不断从队列中取出指令,更新其消费者的优先级,并减少消费者的入度。
5.优先级计算:
在处理每条指令时,根据依赖关系和延迟时间更新消费者的优先级。对于每个消费者,优先级的计算规则是:优先级(v) = 最大值(优先级(u) + 延迟)。在这个过程中,维护优先级数组,记录每条指令的最大优先级和对应的编号。
6.排序结果:
使用排序算法对优先级数组进行排序。首先按优先级从高到低排序,如果优先级相同,则按指令编号升序排序。
7.输出结果:
遍历排序后的优先级数组,输出每条指令的编号(根据需要调整索引),形成最终的排序结果。
代码
Java代码
C++代码
Python代码
Js代码
- 1
Information
- ID
- 36
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 166
- Accepted
- 47
- Uploaded By