找出最低价值顶点到最高价值顶点之间的最小成本路径的程序(Python)

找出最低价值顶点到最高价值顶点之间的最小成本路径的程序(Python)

假设我们有一个无向加权图,并被要求找出从特定节点到另一个特定节点的最小旅行成本路径。旅行成本是计算如下的:假设有一条从顶点A到顶点C的路径,如A->B->C。从A到B的旅行成本为10,从B到C的旅行成本为20。从A到C的旅行成本将是(从A到B旅行的成本)+(从B到C旅行的成本与到节点B的累计旅行成本的差)。所以,这将转化为10 +(20-10)= 20。我们必须在给定的图中找出从第一个节点到最后一个节点(最低值节点到最高值节点)的最小可能旅行值。

所以,如果输入是这样的,

找出最低价值顶点到最高价值顶点之间的最小成本路径的程序(Python)

那么输出将是15。

顶点1和4之间存在两条路径。最佳路径是1->2->4,路径的成本是10 +(15-10)= 15。否则,路径将花费20。

为了解决这个问题,我们将按照以下步骤进行 –

  • adjList:包含空列表的新映射
  • 对于边缘中的每个项目,执行
    • u:item[0]
    • v:item[1]
    • w:item[2]
    • 在adjList [u]的末尾插入对(w,v)
    • 在adjList [v]的末尾插入对(w,u)
  • q:一个新堆
  • v_list:一个新集
  • 在q的末尾插入(0,1)
  • flag:True
  • 只要q不为空,就执行以下操作
    • 从q中弹出最小的项c
    • 如果c[1]在v_list中存在,则
      • 进行下一次迭代
    • 将(c[1])添加到v_list中
    • 如果c[1]与n相同,则
      • flag :False
      • 返回c[0]
    • 对于c[1]中的每个u,执行以下操作
      • 如果u[1]不在v_list中,则
      • out:(u[0]、c[0]、u[1])的最大值
      • 将out推入堆q中
  • 如果flag为True,则
    • 返回-1

示例

让我们看一下以下实现以获得更好的理解 –

from collections import defaultdict
import heapq
def solve(n, edges):
    adjList = defaultdict(list)
    for item in edges:
        u, v, w = map(int, item)
        adjList[u].append((w,v))
        adjList[v].append((w,u))
    q = []
    v_list = set()
    q.append((0,1))
    flag = True
    while q:
        c = heapq.heappop(q)
        if c[1] in v_list:
            continue
        v_list.add(c[1])
        if c[1] == n:
            flag = False
            return c[0]
        for u in adjList[c[1]]:
            if u[1] not in v_list:
                out = (max(u[0],c[0]),u[1])
                heapq.heappush(q,out)    
    if flag:
        return -1

print(solve(4, [(1, 2, 10), (2, 3, 5), (2, 4, 15), (1, 4, 20)]))

输入

4,[(1,2,10),(2,3,5),(2,4,15),(1,4,20)]

输出

15

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程