https://www.acmicpc.net/problem/1504
์์ด๋์ด
1. ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ
- ๋ค์ต์คํธ๋ผ ์๋๋ฉด ํ๋ก์ด๋ ๋ ๊ฐ๋ฅผ ์๊ฐํ๋ค.
- ๋์ ์ v1, v2๋ฅผ ์ง๋๋ ์ต๋จ๊ฒฝ๋ก๋ ๊ฐ๊ฐ์ ์ต๋จ๊ฒฝ๋ก๋ค์ ๋ํ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ฉด ๋๋ค.
- '1 -> N' = '1 -> v1' + 'v1 -> v2' + 'v2 ->N' ๊ฐ์ด ๊ณ์ฐํด์ ๋ ์ ์ ์ ์ง๋๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค.
- ๋ฃจํธ๋ 1 -> v1 -> v2 -> N, 1 -> v2 -> v1 -> N ๋ ๊ฐ์ง๋ฅผ ๊ณ์ฐํด ๋น๊ตํ๋ฉด ์์ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ ์ฒด ์ฝ๋
import sys, heapq
INF = int(1e9)
N, E = map(int,input().split())
graph = [[] for _ in range(N + 1)]
for _ in range(E):
a, b, c = map(int,sys.stdin.readline().rstrip().split())
graph[a].append([b, c])
graph[b].append([a, c])
v1, v2 = map(int,input().split())
def dijkstra(start):
que = []
heapq.heappush(que, (0, start))
D[start] = 0
while que:
dist, now = heapq.heappop(que)
if D[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < D[i[0]]:
D[i[0]] = cost
heapq.heappush(que, (cost,i[0]))
root_A, root_B = 0, 0
D = [INF] * (N + 1)
dijkstra(1) # 1 -> v1, 1 -> v2
root_A += D[v1]
root_B += D[v2]
D = [INF] * (N + 1)
dijkstra(v1) # v1 -> v2, v1 -> N
root_A += D[v2]
root_B += D[N]
D = [INF] * (N + 1)
dijkstra(v2) # v2 -> N, v2 -> v1
root_A += D[N]
root_B += D[v1]
ans = min(root_A, root_B)
if ans >= INF:
print(-1)
else:
print(ans)
์ฝ๋ ์ค๋ช
import sys, heapq
INF = int(1e9)
N, E = map(int,input().split())
graph = [[] for _ in range(N + 1)]
for _ in range(E):
a, b, c = map(int,sys.stdin.readline().rstrip().split())
graph[a].append([b, c])
graph[b].append([a, c])
v1, v2 = map(int,input().split())
๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ ์ธ์ ๋ฆฌ์คํธ ํํ๋ก ์ ๋ ฅ๋ฐ์์ค๋ค.
def dijkstra(start):
que = []
heapq.heappush(que, (0, start))
D[start] = 0
while que:
dist, now = heapq.heappop(que)
if D[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < D[i[0]]:
D[i[0]] = cost
heapq.heappush(que, (cost,i[0]))
๋ฐ์ดํฌ์คํธ๋ผ ์ฝ๋๋ ํ์ ์ฌ์ฉํด์ ๊ตฌํํ๋ค.
๋ฐ์ดํฌ์คํธ๋ผ์ ๋ํ ๋ด์ฉ์ ๋์ด๊ฐ๊ฒ ๋ค.
ํ์ํ ๋ถ๋ค์ ๊ตฌ๊ธ ๊ฒ์์ ์ฌ์ฉํด์ฃผ์ธ์.
root_A, root_B = 0, 0
D = [INF] * (N + 1)
dijkstra(1) # 1 -> v1, 1 -> v2
root_A += D[v1]
root_B += D[v2]
D = [INF] * (N + 1)
dijkstra(v1) # v1 -> v2, v1 -> N
root_A += D[v2]
root_B += D[N]
D = [INF] * (N + 1)
dijkstra(v2) # v2 -> N, v2 -> v1
root_A += D[N]
root_B += D[v1]
ans = min(root_A, root_B)
if ans >= INF:
print(-1)
else:
print(ans)
๋ฌธ์ ์์ ๋ ์ ์ ์ ์ง๋๊ฐ๋ ๋ฐฉ๋ฒ์
1 -> v1 -> v2 -> N, 1 -> v2 -> v1 -> N(root_A, root_B) ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
ํ ๋ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ ์๋ ์ ์ ๊ณผ ์ ์ ์ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํด ๋ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
๋ฌธ์ ์์ ์ด๋ฏธ ์ด๋ํ๋ ์ ์ ์ด๋ ๊ฐ์ ์ผ๋ก ๋ค์ ์ด๋ํ ์ ์๋ค๊ณ ๋์์์ผ๋ฏ๋ก
๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ๋ฌ ๋ฒ ์จ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ ๊ด์ฐฎ๋ค.
๊ทธ๋์ ์ ์ 1, v1, v2 ์ด 3๋ฒ ๋ฐ์ดํฌ์คํธ๋ผ ํจ์๋ฅผ ์คํํด์ root_A์ root_B ๊ฐ์ ๋ํด์ค๋ค.
์ดํ root_A์ root_B ๋ ๊ฐ ์ค ์์ ๊ฐ์ ans ๋ณ์์ ์ ์ฅํ๋ค.
๋ฌธ์ ์์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ -1์ ์ถ๋ ฅํ๋ผ๊ณ ๋์์๋ค.
๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ค๋ ์๊ธฐ๋ ans์ INF๊ฐ์ด ๋ํด์ก๋ค๋ ์๊ธฐ๋ค.
์๋ INF๊ฐ์ด ๋ํด์ก๋ค๋ ๊ฑด ์ด๋ค ๋ ธ๋์ ๋ ธ๋ ์ฌ์ด๊ฐ ์ด์ด์ ธ์์ง ์๋ค๋ ๊ฑธ ๋ปํ๋ค.
๊ทธ๋์ ans๊ฐ INF๋ณด๋ค ํฌ๋ฉด -1์ ์๋๋ฉด ๊ทธ๋ฅ ans๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9466 ํ ํ๋ก์ ํธ (python ํ์ด์ฌ) (0) | 2022.07.31 |
---|---|
[๋ฐฑ์ค] 1806 ๋ถ๋ถํฉ (python ํ์ด์ฌ) (0) | 2022.07.29 |
[๋ฐฑ์ค] 12100 2048(easy) (python ํ์ด์ฌ) (0) | 2022.07.25 |
[๋ฐฑ์ค] 15654 N๊ณผ M(5) (python ํ์ด์ฌ) (0) | 2022.07.13 |
[๋ฐฑ์ค] 1202 ๋ณด์ ๋๋ (python ํ์ด์ฌ) (0) | 2022.07.11 |