-
알고리즘: 백준 1504번 특정한 최단 경로 (feat. python)알고리즘/백준(BaekJoon) 2021. 1. 12. 14:41
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
import sys import heapq read = sys.stdin.readline N, E = map(int, read().split()) graph = {i:[] for i in range(1, N+1)} for _ in range(E): a, b, c = map(int, read().split()) graph[a].append([b,c]) graph[b].append([a,c]) v1, v2 = map(int ,read().split()) INF = sys.maxsize def dijkstra(start, dist): dist[start] = 0 hq = [] heapq.heappush(hq, [0, start]) while hq: cw, cn = heapq.heappop(hq) for nn, nw in graph[cn]: next = nw + cw if next < dist[nn]: dist[nn] = next heapq.heappush(hq, [next, nn]) dist = [0] + [INF for _ in range(N)] dist2 = [0] + [INF for _ in range(N)] dist3 = [0] + [INF for _ in range(N)] dijkstra(1, dist) dijkstra(v1, dist2) dijkstra(v2, dist3) if dist[v1] + dist3[N] > dist[v2] + dist2[N] and dist[v2] + dist2[N] + dist2[v2] < INF: print(dist[v2] + dist2[N] + dist2[v2]) elif dist[v1] + dist3[N] <= dist[v2] + dist2[N] and dist[v1] + dist3[N] + dist2[v2] < INF: print(dist[v1] + dist3[N] + dist2[v2]) else: print(-1)
반응형'알고리즘 > 백준(BaekJoon)' 카테고리의 다른 글
알고리즘: 백준 4485번 녹색 옷 입은 애가 젤다지? (feat. python) (0) 2021.01.12 알고리즘: 백준 13549번 숨바꼭질 (feat. python) (0) 2021.01.12 알고리즘: 백준 1238번 파티 (feat. python) (0) 2021.01.11 알고리즘: 백준 1261번 알고스팟 (feat.python) (0) 2021.01.11 알고리즘: 백준 1753번 최단경로 (feat.python) (0) 2021.01.11