📜  门| GATE CS 2020 |第 56 题(1)

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

门| GATE CS 2020 |第 56 题

这道题是 GATE 2020 年计算机科学考试中的第 56 题,涉及到了图论与动态规划等算法知识。

题目描述

给定一个包含 $N$ 个节点和 $M$ 条边的有向无环图 $G=(V,E)$,每个节点 $v \in V$ 带有一个正整数权重 $w(v)$。请你设计一个时间复杂度为 $O(N+M)$ 的算法,计算从 $G$ 的某个源节点 $s$ 出发所能到达的节点中,权重之和最大的路径的权重之和。

算法分析

可以使用动态规划来解决这个问题,设 $OPT(i)$ 表示从源节点 $s$ 出发到达节点 $i$ 的最大权重和路径对应的权重之和。则 $OPT(i)$ 的递推式可以表示为:

$$ OPT(i) = \max_{(j,i) \in E} {OPT(j) + w(i)} $$

其中 $(j,i)$ 表示图 $G$ 中的一条有向边,即从节点 $j$ 指向节点 $i$。

在计算 $OPT(i)$ 的过程中,我们可以使用拓扑排序来保证每个节点的前驱节点都已经计算过了。同时,我们记录一下最大的 $OPT(i)$ 的值即可。

具体算法如下:

  1. 对图 $G$ 进行拓扑排序,得到节点的拓扑序列 $t_1,t_2,\ldots,t_N$;
  2. 初始化 $OPT(s) = w(s)$,对于 $i \in {1,2,\ldots,N}$ 且 $i \neq s$,初始化 $OPT(i) = - \infty$;
  3. 依次计算节点的 $OPT$ 值,即对于 $i \in {1,2,\ldots,N}$,计算 $OPT(i)$ 的值并更新 $max$;
  4. 返回 $max$。

这个算法的时间复杂度为 $O(N+M)$。

代码实现
def max_weighted_path_sum(G, s):
    N = len(G)
    topo_order = get_topo_order(G)
    OPT = [-float('inf')] * N
    OPT[s] = G.nodes[s]['weight']
    max_weight_sum = G.nodes[s]['weight']
    for i in topo_order:
        for j in G.predecessors(i):
            OPT[i] = max(OPT[i], OPT[j] + G.nodes[i]['weight'])
        max_weight_sum = max(max_weight_sum, OPT[i])
    return max_weight_sum
总结

本题主要考察了对动态规划算法的掌握程度,以及对图论相关算法的应用能力。采用动态规划算法可以在 $O(N+M)$ 时间复杂度内解决问题,同时使用拓扑排序保证了算法的正确性。