๐ ํน์ ํ ์ต๋จ ๊ฒฝ๋ก
๋ฐฑ์ค Class4 Gold4
solved_ac[Class4] ํน์ ํ ์ต๋จ ๊ฒฝ๋ก
๋ฌธ์
๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ค. ์ธ์ค์ด๋ 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์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 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
๐ ์๊ณ ๋ฆฌ์ฆ
โญ๏ธ[๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ Weight๊ฐ ์๋ ๊ทธ๋ํ์์ <ํน์ ๋ ธ๋ โก๏ธ ๋ชจ๋ ๋ ธ๋> ์ต์ ๋น์ฉ์ ๊ตฌํ ๋ ์ฌ์ฉํ๋ค.]โญ๏ธ
์ด ๋ฌธ์ ๋ฅผ ๋ถ์ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- Weight๊ฐ ์กด์ฌํ๋ ๊ทธ๋ํ
- ๋ ธ๋ 1(ํน์ ๋ ธ๋)์์ ๋ ธ๋ N์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก(์ต์ ๋น์ฉ)์ ๊ตฌํด์ผ ํ๋ค.
๋ค์ต์คํธ๋ผ๋ฅผ ์ด์ฉํ๋ฉด ๋ ธ๋ 1์์๋ถํฐ ๋ชจ๋ ๋ ธ๋์ ์ต์ ๋น์ฉ์ด ๊ตฌํด์งํ ๊ณ ์ฐ๋ฆฌ๋ ๋ ธ๋ N(N๋ฒ ์ธ๋ฑ์ค)๋ง ์ถ์ถํ์ฌ ์ด์ฉํ๋ฉด ์ ๋ต์ ๋ง์ถ ์ ์๋ค.
Heap์ ์ด์ฉํ ๋ค์ต์คํธ๋ผ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ ์ฝ๋
## ๋ฌธ์ ์กฐ๊ฑด ์ธํ
##
N,E = map(int,input().split())
graph = [[] for _ in range(N+1)]
for i 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)
heap = []
h.heappush(heap,(0,start))
distance[start] = 0
while heap:
dist,now = h.heappop(heap)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
h.heappush(heap,(cost,i[0]))
return distance
๐ ์ค๊ณ
- ๋ ธ๋ 1 โก๏ธ ๋ ธ๋ v1 โก๏ธ ๋ ธ๋ v2 โก๏ธ ๋ ธ๋ N
- ๋ ธ๋ 1 โก๏ธ ๋ ธ๋ v2 โก๏ธ ๋ ธ๋ v1 โก๏ธ ๋ ธ๋ N
1๋ฒ๊ณผ 2๋ฒ ์ค ์ต์ ์ถ๋ ฅ
โ ๏ธ ์ฃผ์์ฌํญ
๋ง์ง๋ง ์์ธ์ฒ๋ฆฌ ์กฐ๊ฑด
if answer == INF:
๋ก ํ๋ฉด ํ๋ฆฐ๋ค.
์๋ํ๋ฉด ๋ ธ๋ 1 โก๏ธ ๋ ธ๋ v1 = INF , ๋ ธ๋ v1 โก๏ธ ๋ ธ๋ v2 = INF , ๋ ธ๋ v2 โก๏ธ ๋ ธ๋ N = INF ์ผ ๊ฒฝ์ฐ์
answer์ ๊ฐ์ 3*INF๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์์ธ์ฒ๋ฆฌ๋
if answer >= INF:
๋ก ํด์ฃผ์ด์ผ ํ๋ค.
๐จ๐ปโ๐ป CODE
import heapq as h
import sys
input = sys.stdin.readline
INF = int(1e9)
## ๋ฌธ์ ์กฐ๊ฑด ์ธํ
##
N,E = map(int,input().split())
graph = [[] for _ in range(N+1)]
for i 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)
heap = []
h.heappush(heap,(0,start))
distance[start] = 0
while heap:
dist,now = h.heappop(heap)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
h.heappush(heap,(cost,i[0]))
return distance
# === ๋
ธ๋ 1 --> ๋
ธ๋ N (v1,v2 ๊ฒฝ์ ) ===
# ๋
ธ๋ 1 --> ๋
ธ๋ v1 ์ต๋จ ๊ฒฝ๋ก
# ๋
ธ๋ v1 --> ๋
ธ๋ v2 ์ต๋จ ๊ฒฝ๋ก
# ๋
ธ๋ v2 --> ๋
ธ๋ N ์ต๋จ ๊ฒฝ๋ก
# =======================================
sum1 = dijkstra(1)[v1] + dijkstra(v1)[v2] + dijkstra(v2)[N]
sum2 = dijkstra(1)[v2] + dijkstra(v2)[v1] + dijkstra(v1)[N]
answer = min(sum1,sum2)
if answer >= INF:
print(-1)
else:
print(answer)