๐Ÿค–/๋ฐฑ์ค€

๋ฐฑ์ค€ 1504: ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ (Python)

sssbin 2022. 7. 12. 15:22

 

https://www.acmicpc.net/problem/1504

 

1504๋ฒˆ: ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, a๋ฒˆ ์ •์ ์—์„œ b๋ฒˆ ์ •์ ๊นŒ์ง€ ์–‘๋ฐฉํ–ฅ ๊ธธ์ด ์กด

www.acmicpc.net

 

 

๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ •์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

1 -> v1 -> v2 -> n

1 -> v2 -> v1 -> n

๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์„ธ๋ฒˆ(1๋ฒˆ ์ถœ๋ฐœ, v1 ์ถœ๋ฐœ, v2 ์ถœ๋ฐœ) ๋Œ๋ ค์„œ ๋‘ ๊ฐ’ ์ค‘์— ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„์ฃผ๋ฉด ๋œ๋‹ค

 

์ฒ˜์Œ์— ์‹คํŒจํ•ด์„œ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ๊ฐ’์„ ์„ธ๋ฒˆ ๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ๊ฐ’์„ ์ค„์—ฌ์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ํ•ด์„œ ์ค„์˜€๋Š”๋ฐ (1e9 -> 1e8)

์—ฌ์ „ํžˆ ํ‹€๋ฆผ,,,, ์ž์„ธํžˆ ๋ณด๋‹ˆ๊นŒ ์ฝ”๋“œ์— ์˜คํƒ€ ์žˆ์—ˆ๋‹ค ใ…Ž^^ ๋ฉ์ฒญใ…Ž,,

 

import heapq
import sys
input = sys.stdin.readline
INF = int(1e8)

n, e = map(int, input().split())

graph = [[] for i in range(n+1)]

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())

def dijkstra(start):
    distance = [INF] * (n + 1)
    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]))

    return distance

d1 = dijkstra(1)
d2 = dijkstra(v1)
d3 = dijkstra(v2)

res = min(d1[v1] + d2[v2] + d3[n], d1[v2] + d3[v1] + d2[n])

if res >= INF:
    print(-1)
else:
    print(res)