代码随想录算法训练营DAY65|dijkstra(堆优化版)、Bellman_ford 算法

dijkstra(堆优化版)

from collections import defaultdict
import heapq

def dijkstra(graph, n):
    min_dist = [float('inf')]*n
    visited = [False]*n
    
    min_dist[0]=0
    queue = []
    heapq.heappush(queue,[0,0])
    while(queue):
        _, node = heapq.heappop(queue)
        if visited[node]:
            continue
        visited[node]=True
        
        check_list=graph[node]
        for check_node, val in check_list:
            if not visited[check_node]:
                min_dist[check_node]= min(min_dist[check_node],min_dist[node]+val)
                heapq.heappush(queue,[min_dist[check_node],check_node])
        
    if min_dist[-1] == float('inf'):
        print(-1)
    else:
        print(min_dist[-1])
    
        
if __name__=='__main__':
    n,m = map(int, input().split())
    graph = defaultdict(list)
    for i in range(m):
        s,e,v = map(int, input().split())
        graph[s-1].append([e-1,v])
    
    dijkstra(graph, n)
    

Bellman_ford 算法

  • 所以对所有边松弛一次 能得到 与起点 一条边相连的节点最短距离。
def Bellman_ford(graph,n):
    min_dist = [float('inf')]*n
    min_dist[0]=0
    
    for i in range(n-1):
        update=False.   
        for edge in graph:
            from_ = edge[0]
            to_ = edge[1]
            val = edge[2]
            if min_dist[from_]!=float('inf') and min_dist[to_]>min_dist[from_]+val:
                min_dist[to_]=min_dist[from_]+val
                update=True
        # 防止超时
        if not update:
            break
                
        # print(min_dist)  

    if min_dist[-1]==float('inf'):
        print('unconnected')
    else:
        print(min_dist[-1])


if __name__=='__main__':
    n,m=map(int, input().split())
    
    graph = []
    for _ in range(m):
        s,t,v = map(int, input().split())
        graph.append([s-1,t-1,v])
    
    Bellman_ford(graph,n)
    
        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值