📜  门| GATE-CS-2007 |第 71 题(1)

📅  最后修改于: 2023-12-03 14:58:27.646000             🧑  作者: Mango

门| GATE-CS-2007 |第 71 题

该题源自计算机科学与信息技术领域的考试题库 GATE-CS-2007,是一个经典的问题,需要程序员运用数据结构和算法的知识进行解答。

题目描述

给定一个有向图,其中节点编号为1到n。

你需要从节点1出发,通过遍历边来达到节点n。每条边上都有一个非负整数权重,表示通过该边所需花费的代价。

现在,请你编写一个程序,找到到达节点n的最低代价。如果无法到达节点n,则返回-1。

输入格式

输入由多行组成,格式如下:

  • 第一行包含一个整数 t,表示测试用例的数量。
  • 对于每个测试用例:
    • 第一行包含两个整数 n 和 m,表示图中节点和边的数量。
    • 接下来 m 行,每行包含三个整数 x、y 和 w,表示一条从节点 x 到节点 y 的有向边,其代价为 w。
输出格式

对于每个测试用例,输出一个整数表示到达节点 n 的最低代价。如果无法到达节点 n,则输出 -1。

示例

输入:

2
3 3
1 2 1
2 3 2
3 1 4
3 2
1 2 1
2 1 3

输出:

3
-1
解题思路

该问题可以用最短路径算法解决,其中最经典的算法是 Dijkstra 算法。

具体解题步骤如下:

  1. 创建一个数组 distances,用于保存从节点1到其他节点的最低代价。
  2. 初始化 distances 中的所有值为正无穷大。
  3. 将节点1的最低代价设为0,并将其加入一个优先队列(最小堆)。
  4. 重复以下步骤直到优先队列为空:
    1. 弹出队列中代价最低的节点 curr,如果 curr 是节点 n,则返回 distances[n]。
    2. 对于 curr 的所有邻居节点 neighbor ,如果经过 curr 到达 neighbor 的代价小于 distances[neighbor],则更新 distances[neighbor] 为更小值,并将 neighbor 加入优先队列。
  5. 如果以上步骤无法到达节点 n,则返回 -1。
解题代码
import heapq

def dijkstra(graph, n):
    distances = [float("inf")] * (n + 1)
    distances[1] = 0

    pq = [(0, 1)]

    while pq:
        cost, curr = heapq.heappop(pq)

        if curr == n:
            return distances[n]

        if cost > distances[curr]:
            continue

        for neighbor, weight in graph[curr]:
            new_cost = cost + weight

            if new_cost < distances[neighbor]:
                distances[neighbor] = new_cost
                heapq.heappush(pq, (new_cost, neighbor))

    return -1

def find_lowest_cost(t, test_cases):
    results = []
    
    for _ in range(t):
        n, m = test_cases[_][0]

        graph = [[] for _ in range(n+1)]
        for i in range(m):
            x, y, w = test_cases[_][1][i]
            graph[x].append((y, w))

        results.append(dijkstra(graph, n))

    return results
运行测试
t = 2
test_cases = [
    [(3, 3), [(1, 2, 1), (2, 3, 2), (3, 1, 4)]],
    [(3, 2), [(1, 2, 1), (2, 1, 3)]]
]

print(find_lowest_cost(t, test_cases))

运行测试将输出 [3, -1]

总结

该题是一个经典的图论问题,通过实现 Dijkstra 算法可以找到最低代价到达目标节点的路径。熟悉图论和最短路径算法的程序员可以通过解决该题来提升自己的算法设计与实现能力。