📜  门| GATE-CS-2000 |问题 8(1)

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

GATE-CS-2000 Question 8

该问题是一道编程问题,要求实现一个程序来计算有向无环图的最长路径长度。

输入

输入包含以下几行:

  • 第一行是节点数目n
  • 接下来的n行是节点之间的边,每行包含三个整数u、v和w,表示从节点u到节点v有一条边,权重为w。
输出

输出最长路径长度。

示例

输入:

6
1 2 5
1 3 3
2 4 3
2 5 2
3 4 1
4 6 2
5 6 4

输出:

11
解题思路

本题是一道动态规划问题,通过拓扑排序和动态规划的方式求解一个带权有向无环图(DAG)的最长路径问题。

首先对DAG拓扑排序,然后按上述排序,计算最长路径。具体地,对于某个节点,将其到达的所有节点的最长路径计算出来,然后该节点的最长路径为这些值的最大值加上该节点的权值。最后,遍历所有节点,得到最大最长路径值即为所求。

代码实现

以下是Python实现该算法的代码片段:

def longest_path(n, edges):
    adj_lst = [[] for _ in range(n)]
    indegrees = [0] * n
    for u, v, w in edges:
        adj_lst[u - 1].append((v - 1, w))
        indegrees[v - 1] += 1
    queue = deque([i for i in range(n) if not indegrees[i]])
    dist = [-1] * n
    dist[queue[0]] = 0
    while queue:
        u = queue.popleft()
        for v, w in adj_lst[u]:
            indegrees[v] -= 1
            if not indegrees[v]:
                queue.append(v)
            dist[v] = max(dist[v], dist[u] + w)
    return max(dist)

其中longest_path函数的参数为节点数n和边列表edges,返回DAG的最长路径长度。