用 Python 编写程序,查找从第一个节点到最后一个节点的受限路径数

pythonserver side programmingprogramming更新于 2025/12/2 9:16:17

假设我们有一个无向加权连通图。该图有 n 个节点,它们被标记为从 1 到 n。从起点到终点的路径是一系列节点,如 [z0, z1, z2, ..., zk],其中 z0 是起始节点,zk 是终止节点,zi 和 zi+1 之间有一条边,其中 0 <= i <= k-1。路径的距离是路径边缘权重值的总和。让 dist(x) 表示从节点 n 到节点 x 的最短距离。受限路径是一种特殊路径,它还满足 dist(zi) > dist(zi+1),其中 0 <= i <= k-1。因此,我们必须找到从节点 1 到节点 n 的受限路径数。如果答案太大,则返回答案模 10^9 + 7。

因此,如果输入如下

那么输出将是 3,因为有三个受限路径 (1,2,5)、(1,2,3,5)、(1,3,5)。

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

  • graph := 由给定边列表组成的图的邻接列表

  • paths := 大小为 (n+1) 的数组,并填充0

  • paths[n] := 1

  • dists := 一个大小为 (n+1) 的数组,并填充 -1

  • q := 一个队列,最初插入 (0, n)

  • 当 q 不为空时,执行

    • (dist, node) := q 的前元素并将其从 q 中删除

    • 如果 dists[node] 不等于 -1,则

      • 进行下一次迭代

    • dists[node] := dist

    • 对于 graph[node] 的每个相邻节点 v 和权重 w,执行

      • 如果 dists[v] 与 -1 相同,则

        • 将 (dist + w, v) 插入 q

      • 否则,当 dists[v] < dists[node] 时,则

        • paths[node] := routes[node] + routes[v]

    • 如果 node 与 1 相同,则

      • 返回 routes[node] mod 10^9+7

  • 返回 0

示例

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

from collections import defaultdict
from heapq import heappop, heappush
def solve(n, edges):
   graph = defaultdict(dict)
   for u, v, w in edges:
      graph[u][v] = w
      graph[v][u] = w

   paths = [0] * (n+1)
   paths[n] = 1
   dists = [-1] * (n+1)
   q = [(0, n)]

   while q:
      dist, node = heappop(q)
      if dists[node] != -1:
         continue

      dists[node] = dist
      for v, w in graph[node].items():
         if dists[v] == -1:
            heappush(q, (dist + w, v))
         elif dists[v] < dists[node]:
            paths[node] += paths[v]

      if node == 1:
         return paths[node] % (10**9 + 7)

   return 0

n = 5
edges = [(1,2,3),(1,3,3),(2,3,1),(1,4,2),(5,2,2),(3,5,1),(5,4,10)]
print(solve(n, edges))

输入

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

输出

3

相关文章


有用资源