๋ฌธ์
๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค. ์ธ์ค์ด๋ 1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ค๊ณ ํ๋ค. ๋ํ ์ธ์ค์ด๋ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ์ด๋ํ๋ ํน์ ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ณ ์ถ์๋ฐ, ๊ทธ๊ฒ์ ๋ฐ๋ก ์์๋ก ์ฃผ์ด์ง ๋ ์ ์ ์ ๋ฐ๋์ ํต๊ณผํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ธ์ค์ด๋ ํ๋ฒ ์ด๋ํ๋ ์ ์ ์ ๋ฌผ๋ก , ํ๋ฒ ์ด๋ํ๋ ๊ฐ์ ๋ ๋ค์ ์ด๋ํ ์ ์๋ค. ํ์ง๋ง ๋ฐ๋์ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํด์ผ ํ๋ค๋ ์ฌ์ค์ ์ฃผ์ํ๋ผ. 1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ์ผ๋ก ์ด๋ํ ๋, ์ฃผ์ด์ง ๋ ์ ์ ์ ๋ฐ๋์ ๊ฑฐ์น๋ฉด์ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N๊ณผ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) ๋์งธ ์ค๋ถํฐ E๊ฐ์ ์ค์ ๊ฑธ์ณ์ ์ธ ๊ฐ์ ์ ์ a, b, c๊ฐ ์ฃผ์ด์ง๋๋ฐ, a๋ฒ ์ ์ ์์ b๋ฒ ์ ์ ๊น์ง ์๋ฐฉํฅ ๊ธธ์ด ์กด์ฌํ๋ฉฐ, ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ c๋ผ๋ ๋ป์ด๋ค. (1 ≤ c ≤ 1,000) ๋ค์ ์ค์๋ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ์ ๋ฒํธ v1๊ณผ v2๊ฐ ์ฃผ์ด์ง๋ค. (v1 ≠ v2, v1 ≠ N, v2 ≠ 1) ์์์ ๋ ์ ์ u์ v์ฌ์ด์๋ ๊ฐ์ ์ด ์ต๋ 1๊ฐ ์กด์ฌํ๋ค.
์์ ์ ๋ ฅ 1
4 6
1 2 3
2 3 3
3 4 1
1 3 5
2 4 5
1 4 4
2 3
์์ ์ถ๋ ฅ 1
7
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด์ง๋ง ํน์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ค๋ ์ ์ฝ์กฐ๊ฑด์ด ์๋ค.
์์ ์ง์ ์ Start, ์ข ์ ์ End, ๊ฑฐ์ณ์ผ ํ ๋ ธ๋๋ฅผ V1, V2๋ผ๊ณ ํ๋ค๋ฉด
๊ณ ๋ คํด ๋ณผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋
1. Start - V1 - V2 - End
2. Start - V2 - V1 - End ๋ก ๋ณผ ์ ์๋ค.
Start - V1 - V2 - End ํน์ Start - V2 - V1 - End ๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๊ธฐ ์ํด์๋
Start - V1 , V1 - V2, V2 - End๊ฐ ๊ฐ๊ฐ ์ต๋จ ๊ฒฝ๋ก ๋ง์กฑ์ํค๊ฑฐ๋ ํน์
Start - V2, V2 - V1, V1 - End๊ฐ ๊ฐ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ง์กฑ์์ผ์ผ ํ๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด
Start ์์ ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฒฝ๋ก
V1 ์์ ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฒฝ๋ก
V2 ์์ ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ฐ๊ฐ ๊ตฌํ ๋ค,
Start - V1 - V2 - End ์ Start - V2 - V1 - End ์ค์์ ์ต์๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ ์ ํํ๋ฉด ๋๋ค.
import sys
import heapq
import copy
INF = int(1e9)
n,m = map(int,input().split())
graph = [[] for _ in range(n+1)]
for _ in range(m):
a,b,c = map(int,sys.stdin.readline().split())
graph[a].append((c,b))
graph[b].append((c,a))
x,y = map(int,input().split())
queue = []
def dijkstra(start):
heapq.heappush(queue, (0, start))
distance[start] = 0
while queue:
dist, current = heapq.heappop(queue)
if distance[current] < dist:
continue
for node in graph[current]:
cost = dist + node[0]
if distance[node[1]] > cost:
distance[node[1]] = cost
heapq.heappush(queue, (cost, node[1]))
distance = [INF] * (n+1)
dijkstra(1)
ds = copy.deepcopy(distance)
distance = [INF] * (n+1)
dijkstra(x)
dx = copy.deepcopy(distance)
distance = [INF] * (n+1)
dijkstra(y)
dy = copy.deepcopy(distance)
print(-1 if min(ds[x] + dx[y] + dy[n], ds[y] + dy[x] + dx[n]) >= INF else min(ds[x] + dx[y] + dy[n], ds[y] + dy[x] + dx[n]))
'๐์ฝ๋ฉํ ์คํธ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2206 - ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (Python) (0) | 2024.08.21 |
---|---|
[๋ฐฑ์ค] 9663 - N Queen (Python) (0) | 2024.08.20 |
[๋ฐฑ์ค] 1916 - ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ (Python) (0) | 2024.08.19 |
[๋ฐฑ์ค] 11404 - ํ๋ก์ด๋ (Python) (0) | 2024.08.19 |
[๋ฐฑ์ค] 11779 - ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ 2 (Python) (0) | 2024.08.19 |