📅  最后修改于: 2023-12-03 15:28:39.600000             🧑  作者: Mango
这是一道 GATE CS 2018 模拟试题,涉及到图数据结构的知识。该题需要求解一个有向图中的关键路径(critical path),并返回其长度。
关键路径是指在一个有向无环图(DAG)中,从源点到汇点的路径中,具有最长路径长度的路径。它是通过计算有向图中所有路径的长度,从而找出控制整个系统的最长路径来实现的。
对于这道题,我们需要先构建一个 DAG,再利用其拓补序列(topological sorting)计算关键路径。要注意的是,这个方法仅适用于 DAG,如果图中存在环,则该方法不适用。
具体步骤如下:
构建 DAG。
计算每个节点的最早开始时间 ES 和最晚开始时间 LS,以及每个活动的最早完成时间 EF 和最晚完成时间 LF。
具体计算方法如下:
ES = max (ES of all incoming edges) + 1
EF = ES + 活动耗时
LF = min (LF of all outgoing edges) - 活动耗时
LS = LF - 活动耗时
计算每个活动的浮动时间 TF = LS -ES。
如果 TF = 0,则该活动在关键路径中,将其长度加入结果。
返回关键路径的长度。
下面是计算关键路径的 Python 代码实现(假设图已经存储在邻接表中):
def critical_path(adj_list):
# 计算节点的入度
in_degrees = [0] * len(adj_list)
for node, edges in adj_list.items():
for edge in edges:
in_degrees[edge[0]] += 1
# 初始化 ES 和 LS,EF 和 LF,浮动时间和结果
ES = [0] * len(adj_list)
LS = [0] * len(adj_list)
EF = [0] * len(adj_list)
LF = [float("inf")] * len(adj_list)
TF = [0] * len(adj_list)
result = 0
# 计算 ES 和 EF
for node in range(len(adj_list)):
if in_degrees[node] == 0:
ES[node] = 0
EF[node] = ES[node] + 1
else:
ES[node] = max([EF[edge[0]] for edge in adj_list[node]])
EF[node] = ES[node] + 1
# 计算 LS 和 LF
for node in range(len(adj_list) - 1, -1, -1):
if len(adj_list[node]) == 0:
LF[node] = EF[node]
LS[node] = LF[node] - 1
else:
LF[node] = min([LS[edge[0]] for edge in adj_list[node]])
LS[node] = LF[node] - 1
# 计算浮动时间和关键路径
for node, edges in adj_list.items():
for edge in edges:
TF[edge[0]] = LS[edge[0]] - EF[node]
if TF[edge[0]] == 0:
result += edge[1]
return result
本题考察了图数据结构以及关键路径的计算方法。了解了这些知识后,我们就能很轻松地解决类似的图论问题。