1753最短経路図


谷.
これはダエストラの問題です.
基本的にこの問題を2つの方法で解くことができる.
第1の方法はO(n^2)の時間的複雑さを必要とし,第2の方法はO(nlogn)の時間的複雑さを必要とする.
もちろん2つ目の方法を使ったほうがいいです.
重要なのは,マルチ出口アルゴリズムのどの部分が時間の複雑さを異なるものにできるかを知ることである.
まず,多翼点アルゴリズムの展開過程を書き,どの部分が異なる可能性があるかを決定する.
  • は、特定のノード(開始ノード)から他のノードへのすべてのコストを無限大に初期化する.
  • グラフィック配列(隣接リスト)を作成し、パスをすべて配列に配置します.
  • startからツアー開始
    4.アクセスが必要なノードを含む優先キューまたはheapqを作成します.O(logn)
    4-1. cost配列で最小ノードを探します.O(n)
  • コストの最小ノードが見つかり、既存のパスのコストを最小ノードを通過するコストと比較して、より小さな値が得られます.
  • は、すべてのノードを巡回し、最終的には特定のノードからすべてのノードへの最小コストを含む.
  • すべてのノードを巡回する場合,最小パスを検索する方法はheapを用いてO(logn)を通過する時間複雑度を用いて最小パスを検索する方法と大きく異なる.
    import heapq
    
    V, E = map(int, input().split(" "))
    INF = int(1e9)
    
    start = int(input())
    graph = [[] for _ in range(V+1)]
    distance = [INF] * (V+1)
    
    for i in range(E):
        a, b, c = map(int, input().split(" "))
        graph[a].append((b, c))
    
    def solution():
        global start
        dijkstra(start)
        for i in range(1, V+1):
            if distance[i] == INF:
                print("INF")
            else:
                print(distance[i])
    
    
    def dijkstra(start):
        q = []
        heapq.heappush(q, (0, start))
        distance[start] = 0
    
        while q:
            dist, now = heapq.heappop(q)
    
            if distance[now] < dist:
                continue
            for i in graph[now]:
                cost = dist + i[1]
                if cost < distance[i[0]]:
                    distance[i[0]] = cost
                    heapq.heappush(q, (cost, i[0]))
    solution()