[白俊]504号-(Python Python)-Dijkstra
質問リンク:https://www.acmicpc.net/problem/1504
この問題は方向性のない図形の中で2つの頂点を求めるときの最短距離の問題である.
v 1、v 2の2つの頂点を過ぎてn番の頂点に着くには、最初は必ずv 1、v 2を順番に通過しなければならないと思っていたが、問題を提起し、なぜ間違っているのか分からず、ずっと悩んでいた.
2つの頂点を通過しなければならない問題を解決すれば,すぐに多極値アルゴリズムを用いて解決できる.
リンクテキスト
Baek Jun(1916回)-「最小料金を求める」(ドエストラアルゴリズム)リンクで説明していますが、参考にすれば分かりやすいと思います.
この問題は方向性のない図形の中で2つの頂点を求めるときの最短距離の問題である.
v 1、v 2の2つの頂点を過ぎてn番の頂点に着くには、最初は必ずv 1、v 2を順番に通過しなければならないと思っていたが、問題を提起し、なぜ間違っているのか分からず、ずっと悩んでいた.
2つの頂点を通過しなければならない問題を解決すれば,すぐに多極値アルゴリズムを用いて解決できる.
リンクテキスト
Baek Jun(1916回)-「最小料金を求める」(ドエストラアルゴリズム)リンクで説明していますが、参考にすれば分かりやすいと思います.
import sys
from heapq import heappush, heappop
input = sys.stdin.readline
inf = sys.maxsize
n, e = map(int, input().split())
graph = [[] for _ in range(n + 1)]
dp_1 = [inf] * (n + 1)
dp_2 = [inf] * (n + 1)
dp_3 = [inf] * (n + 1)
def dijkstra(start, dp):
heap = []
heappush(heap, [0, start])
dp[start] = 0
while heap:
w, n = heappop(heap)
for n_n, wei in graph[n]:
n_w = wei + w
if n_w < dp[n_n]:
dp[n_n] = n_w
heappush(heap, [n_w, n_n])
for _ in range(e):
a, b, c = map(int, input().split())
graph[a].append([b, c])
graph[b].append([a, c])
v1, v2 = map(int, input().split())
dijkstra(1, dp_1)
dijkstra(v1, dp_2)
dijkstra(v2, dp_3)
min_ = min(dp_1[v1] + dp_2[v2] + dp_3[n], dp_1[v2] + dp_2[n] + dp_3[v1])
if min_ >= inf:
print(-1)
else:
print(min_)
Reference
この問題について([白俊]504号-(Python Python)-Dijkstra), 我々は、より多くの情報をここで見つけました https://velog.io/@hamfan524/백준-1504번-Python-파이썬-Dijkstraテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol