程序查找在python中达到最终目标所需的最少总线数

假设我们有一个3矩阵,其中每行包含三个字段[src,dest,id],这意味着总线具有从src到dest的路线。上一辆新巴士要花一单位的钱,但是如果我们坐同一辆车,我们只需要付一单位的钱。我们必须找到从位置0到终点站(最大的位置)乘公共汽车所需的最低费用。如果没有解决方案,则返回-1。

所以,如果输入像

0
1
0
1
2
0
2
3
0
3
5
1
5
0
2

则输出将为2,因为我们可以在位置0处取0,然后在位置3处下车。然后我们乘公共汽车1到达位置5。

为了解决这个问题,我们将遵循以下步骤-

  • 开始:= 0

  • 目标:=给定矩阵的最大位置

  • adj:=一个空的映射

  • 对于每个src,dest,连接中的id,执行

    • 在adj [src]的末尾插入(dest,id)

  • hp:=具有项(0,start,-1)的堆

  • 看到:=一个空的映射

  • 当hp不为空时,执行

    • next_cost:=成本

    • 如果nex_bus与cur_bus不同,则

    • 将(next_cost,nex_pos,nex_bus)插入堆hp

    • next_cost:= next_cost + 1

    • 进行下一次迭代

    • 返回成本

    • (cost,cur_pos,cur_bus):=堆hp的top元素,并从hp中删除top

    • 如果cur_pos与目标相同,则

    • 如果看到cur_bus [cur_pos],则

    • 将cur_bus插入到seen [cur_pos]

    • 对于adj [cur_pos]中的每个(nex_pos,nex_bus),执行

    • 返回-1

    让我们看下面的实现以更好地理解-

    例 

    from collections import defaultdict
    from heapq import heapify, heappop, heappush
    class Solution:
       def solve(self, connections):
          start = 0
          target = max(max(y, x) for y, x, _ in connections)
    
          adj = defaultdict(list)
          for f, t, id in connections:
             adj[f].append((t, id))
    
          hp = [(0, start, -1)]
          seen = defaultdict(set)
    
          while hp:
             cost, cur_pos, cur_bus = heappop(hp)
             if cur_pos == target:
                return cost
             if cur_bus in seen[cur_pos]:
                continue
             seen[cur_pos].add(cur_bus)
    
             for nex_pos, nex_bus in adj[cur_pos]:
                next_cost = cost
                if nex_bus != cur_bus:
                   next_cost += 1
                heappush(hp, (next_cost, nex_pos, nex_bus))
    
          return -1
    
    ob = Solution()matrix = [
       [0, 1, 0],
       [1, 2, 0],
       [2, 3, 0],
       [3, 5, 1],
       [5, 0, 2]
    ]
    print(ob.solve(matrix))

    输入值

    matrix = [[0, 1, 0],  
    [1, 2, 0],  
    [2, 3, 0],  
    [3, 5, 1],  
    [5, 0, 2]]

    输出结果

    2
    猜你喜欢