📜  门| GATE CS Mock 2018 |问题 37(1)

📅  最后修改于: 2023-12-03 15:28:39.600000             🧑  作者: Mango

GATE CS Mock 2018 | 问题 37

这是一道 GATE CS 2018 模拟试题,涉及到图数据结构的知识。该题需要求解一个有向图中的关键路径(critical path),并返回其长度。

关键路径

关键路径是指在一个有向无环图(DAG)中,从源点到汇点的路径中,具有最长路径长度的路径。它是通过计算有向图中所有路径的长度,从而找出控制整个系统的最长路径来实现的。

解题思路

对于这道题,我们需要先构建一个 DAG,再利用其拓补序列(topological sorting)计算关键路径。要注意的是,这个方法仅适用于 DAG,如果图中存在环,则该方法不适用。

具体步骤如下:

  1. 构建 DAG。

  2. 计算每个节点的最早开始时间 ES 和最晚开始时间 LS,以及每个活动的最早完成时间 EF 和最晚完成时间 LF

    具体计算方法如下:

    ES = max (ES of all incoming edges) + 1

    EF = ES + 活动耗时

    LF = min (LF of all outgoing edges) - 活动耗时

    LS = LF - 活动耗时

  3. 计算每个活动的浮动时间 TF = LS -ES

    如果 TF = 0,则该活动在关键路径中,将其长度加入结果。

  4. 返回关键路径的长度。

代码实现

下面是计算关键路径的 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
总结

本题考察了图数据结构以及关键路径的计算方法。了解了这些知识后,我们就能很轻松地解决类似的图论问题。