代码随想录算法训练营第六十五天| 图论10

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904

Bellman_ford 队列优化算法(又名SPFA)

         
代码随想录

     
  1. import collections
  2. def main():
  3.     n, m = map(int, input().strip().split())
  4.     edges = [[] for _ in range(n + 1)]
  5.     for _ in range(m):
  6.         src, dest, weight = map(int, input().strip().split())
  7.         edges[src].append([dest, weight])
  8.    
  9.     minDist = [float("inf")] * (n + 1)
  10.     minDist[1] = 0
  11.     que = collections.deque([1])
  12.     visited = [False] * (n + 1)
  13.     visited[1] = True
  14.    
  15.     while que:
  16.         cur = que.popleft()
  17.         visited[cur] = False
  18.         for dest, weight in edges[cur]:
  19.             if minDist[cur] != float("inf") and minDist[cur] + weight < minDist[dest]:
  20.                 minDist[dest] = minDist[cur] + weight
  21.                 if visited[dest] == False:
  22.                     que.append(dest)
  23.                     visited[dest] = True
  24.    
  25.     if minDist[-1] == float("inf"):
  26.         return "unconnected"
  27.     return minDist[-1]
  28. if __name__ == "__main__":
  29.     print(main())
复制代码
  bellman_ford之判定负权回路

      
代码随想录

     
  1. import sys
  2. def main():
  3.     input = sys.stdin.read
  4.     data = input().split()
  5.     index = 0
  6.    
  7.     n = int(data[index])
  8.     index += 1
  9.     m = int(data[index])
  10.     index += 1
  11.    
  12.     grid = []
  13.     for i in range(m):
  14.         p1 = int(data[index])
  15.         index += 1
  16.         p2 = int(data[index])
  17.         index += 1
  18.         val = int(data[index])
  19.         index += 1
  20.         # p1 指向 p2,权值为 val
  21.         grid.append([p1, p2, val])
  22.     start = 1  # 起点
  23.     end = n    # 终点
  24.     minDist = [float('inf')] * (n + 1)
  25.     minDist[start] = 0
  26.     flag = False
  27.     for i in range(1, n + 1):  # 这里我们松弛n次,最后一次判断负权回路
  28.         for side in grid:
  29.             from_node = side[0]
  30.             to = side[1]
  31.             price = side[2]
  32.             if i < n:
  33.                 if minDist[from_node] != float('inf') and minDist[to] > minDist[from_node] + price:
  34.                     minDist[to] = minDist[from_node] + price
  35.             else:  # 多加一次松弛判断负权回路
  36.                 if minDist[from_node] != float('inf') and minDist[to] > minDist[from_node] + price:
  37.                     flag = True
  38.     if flag:
  39.         print("circle")
  40.     elif minDist[end] == float('inf'):
  41.         print("unconnected")
  42.     else:
  43.         print(minDist[end])
  44. if __name__ == "__main__":
  45.     main()
复制代码
  bellman_ford之单源有限最短路

      
代码随想录

      
  1. def main():
  2.     # 輸入
  3.     n, m = map(int, input().split())
  4.     edges = list()
  5.     for _ in range(m):
  6.         edges.append(list(map(int, input().split() )))
  7.    
  8.     start, end, k = map(int, input().split())
  9.     min_dist = [float('inf') for _ in range(n + 1)]
  10.     min_dist[start] = 0
  11.    
  12.     # 只能經過k個城市,所以從起始點到中間有(k + 1)個邊連接
  13.     # 需要鬆弛(k + 1)次
  14.    
  15.     for _ in range(k + 1):
  16.         update = False
  17.         min_dist_copy = min_dist.copy()
  18.         for src, desc, w in edges:
  19.             if (min_dist_copy[src] != float('inf') and
  20.             min_dist_copy[src] + w < min_dist[desc]):
  21.                 min_dist[desc] = min_dist_copy[src] + w
  22.                 update = True
  23.         if not update:
  24.             break
  25.     # 輸出
  26.     if min_dist[end] == float('inf'):
  27.         print('unreachable')
  28.     else:
  29.         print(min_dist[end])
  30.             
  31.             
  32. if __name__ == "__main__":
  33.     main()
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表