代码随想录算法训练营 Day 51

1 minute read

Published:

Q1. KamaCoder 47

dijkstra算法优化版:适用于节点数量较多,但是边数量较少的场景

import heapq
from collections import defaultdict

if __name__ == '__main__':
    n, m = map(int, input().split())
    
    edge = defaultdict(list)
    for _ in range(m):
        s, e, v = map(int, input().split())
        edge[s].append((e, v))
    
    min_dist = [float('inf')] * (n + 1)
    visited = [False] * (n + 1)
    
    pq = []
    heapq.heappush(pq, (0, 1))
    min_dist[1] = 0
    
    while pq:
        curr_dist, curr_node = heapq.heappop(pq)
        
        if visited[curr_node]:
            continue
        
        visited[curr_node] = True
        
        for e, d in edge[curr_node]:
            if not visited[e] and curr_dist + d < min_dist[e]:
                min_dist[e] = curr_dist + d
                heapq.heappush(pq, (min_dist[e], e))
    
    print(min_dist[-1] if min_dist[-1] != float('inf') else -1)

Q2. KamaCoder 94

Bellman_ford算法:处理存在负数权值的最短路算法

按照给定边的顺序遍历$n-1$次(n为节点数量),就能找到起点到终点的最短距离。

注意遍历中的更新条件

if __name__ == '__main__':
    n, m = map(int, input().split())
    
    edges = []
    for _ in range(m):
        s, t, v = map(int, input().split())
        edges.append((s, t, v))
    
    min_dist = [float('inf')] * (n + 1)
    min_dist[1] = 0
    
    for _ in range(1, n):
        updated = False
        
        for src, tar, weight in edges:
            if min_dist[src] != float('inf') and min_dist[src] + weight < min_dist[tar]:
                min_dist[tar] = min_dist[src] + weight
                updated = True
                
        # 提前退出策略,当本次遍历不存在更新操作时,退出循环
        if not updated:
            break
    
    print(min_dist[-1] if min_dist[-1] != float('inf') else 'unconnected')