本题是依赖图上的影响面扩散 + DAG 并行调度。
deps 中 [a, b] 表示 a 依赖 b。变更沿反向边传播:若 a 依赖 b,则建边 b → a。从 changed 做 BFS/DFS,得到所有直接或间接受影响的模块集合 S。S 内考虑依赖。对 u ∈ S,设其在 S 内的依赖为 D(u),则finish[u]=buildTime[u]+v∈D(u)maxfinish[v]
代码仓有 n 个模块,编号 0∼n−1。
deps 中每一项 [a, b] 表示:模块 a 依赖 模块 b(要构建 a,须先构建完 b)。保证依赖关系无环。buildTime[i]:模块 i 单独构建一次所需时间。changed:本次发生变更的模块列表。某个模块需要重建,当且仅当:
changed 中,或a 依赖 b,则 b 变更会迫使 a 重建)每个需重建模块在本次流程中只构建一次。不在重建集合中的模块视为已就绪,不必等待。
从时刻 0 开始。一个需重建模块可以立刻开工,当且仅当:它依赖的、且也在本次重建集合中的模块都已构建完成。
buildTime 时间,不可中断某模块的完成时刻 = 它允许开工的最早时刻 + buildTime。
请返回:所有需重建模块都完成的最早时刻。若重建集合为空,返回 0。
请实现:
minRebuildTime(n: int, deps: int[][], buildTime: int[], changed: int[]) -> int
四行:
ndepsbuildTimechanged约束:
一个整数:最早完成时刻。
输入:
3
[[0, 1], [0, 2], [1, 2]]
[5, 3, 2]
[2]
输出:
10
说明:
2 变更后,依赖它的 1、以及依赖 1/2 的 0 都要重建,集合为 {0,1,2}。
答案为 10。
输入:
4
[[1, 0], [2, 0], [3, 1]]
[1, 1, 1, 1]
[3]
输出:
1
说明:
仅模块 3 变更,且没有模块依赖 3,重建集合为 {3},耗时 1。
输入:
2
[]
[4, 7]
[0, 1]
输出:
7
说明:
两模块都变更、互不依赖,可并行,完成时刻为 max(4,7)=7。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.