📅  最后修改于: 2023-12-03 14:58:27.646000             🧑  作者: Mango
该题源自计算机科学与信息技术领域的考试题库 GATE-CS-2007,是一个经典的问题,需要程序员运用数据结构和算法的知识进行解答。
给定一个有向图,其中节点编号为1到n。
你需要从节点1出发,通过遍历边来达到节点n。每条边上都有一个非负整数权重,表示通过该边所需花费的代价。
现在,请你编写一个程序,找到到达节点n的最低代价。如果无法到达节点n,则返回-1。
输入由多行组成,格式如下:
对于每个测试用例,输出一个整数表示到达节点 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 算法。
具体解题步骤如下:
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 算法可以找到最低代价到达目标节点的路径。熟悉图论和最短路径算法的程序员可以通过解决该题来提升自己的算法设计与实现能力。