๋ฌธ์ ๋งํฌ
1916๋ฒ: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ
๋ฌธ์ ์์ฝ
N๊ฐ์ ๋์๊ฐ ์๊ณ , ํ ๋์์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋์์ ๋์ฐฉํ๋ M๊ฐ์ ๋ฒ์ค๊ฐ ์๋ค. ๊ฐ M๊ฐ์ ๋ฒ์ค์ ๋ํด '์ถ๋ฐ ๋์, ๋์ฐฉ ๋์, ๋น์ฉ'์ด ์ฃผ์ด์ง๋ค. A ๋์์์ B ๋์๋ก ๊ฐ๋ ์ต์ ๋น์ฉ์ ๊ตฌํ์. ๋์๋ 1๋ถํฐ N๊น์ง์ ์์ฐ์๋ก ๋ํ๋๋ค.
ํ์ด ์ค๋ช
์ถ๋ฐ ์ง์ ๋ถํฐ ๋์ฐฉ ์ง์ ๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๊ฒ, ๋ค์ต์คํธ๋ผ(dijkstra) ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ ์ ์ถ๋ ฅ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋, ๋ค๋ฅธ ์ ๋ ฅ๋ค์์๋ ๋ต์ ๊ตฌํ ์ ์์ผ๋ฆฌ๋ผ ์๊ฐ๋์๋ค.
visited๋ฅผ ํ์ฉํ ๋ค์ต์คํธ๋ผ ๊ตฌํ
์ด์ +๊ทธ์ ๋ฌธ์ ๋ค์ ํ๋ฉด์ visited ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ธ ์ค๋ณต ํ์์ ๋ฐฉ์งํ์ฌ ์์ ์๊ฐ ๊ฐ์ ์ ํ์ํ๋ค๋ ๊ฒ์ ๋๊ปด์ ์ค๋ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ๋ ๋์ผํ๊ฒ visited ๋ฐฐ์ด์ ํ์ฉํ์ฌ ๊ตฌํํ๊ณ ์ ํ์๋ค.
from heapq import heappush, heappop
import sys
input=sys.stdin.readline
N=int(input().rstrip())
M=int(input().rstrip())
buses={}
for i in range(1, N+1):
buses[i]=[]
for _ in range(M):
start, end, cost=map(int, input().rstrip().split())
buses[start].append((cost, start, end))
start, end=map(int, input().rstrip().split())
a_start, a_end=start, end
min_cost=[1000000000 for _ in range(N+1)]
visited=[[0 for _ in range(N+1)] for _ in range(N+1)]
min_cost[start]=0
heap=[(0, start, start)]
visited[start][start]=1
while heap:
cost, start, end=heappop(heap)
c_cost=cost+min_cost[start]
if min_cost[end]<c_cost:
continue
for bus in buses[end]:
n_cost, n_start, n_end=bus
if visited[n_start][n_end]==1:
continue
elif visited[n_start][n_end]==0:
if c_cost+n_cost<min_cost[n_end]:
min_cost[n_end]=c_cost+n_cost
heappush(heap, bus)
visited[n_start][n_end]=1
print(min_cost[a_end])
ํ์ง๋ง, ๊ฒฐ๊ณผ๋ ํ๋ ธ์ต๋๋ค.
์ด๋ฒ ๋ฌธ์ ์์ ์ ๋ ฅ ์กฐ๊ฑด ์ ํ์ฌํญ์ ๋จ์ํ๊ฒ visited๋ฅผ ์ฌ์ฉํ ์ ์๋ ์กฐ๊ฑด์ด์๋ค. (๋ฒ์ค ์ถ๋ฐ ๋์, ๋ฒ์ค ๋์ฐฉ ๋์, ์์ ์๊ฐ)์ ํํ๋ก ์ ๋ ฅ๋๋ input์์ (๋ฒ์ค ์ถ๋ฐ ๋์, ๋ฒ์ค ๋์ฐฉ ๋์)๊ฐ ์ค๋ณตํ์ฌ ์ ๋ ฅ๋ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ์ด ์ ๋ฌธ์ ๊ฐ ๋๋๋ฉด, ๋ง์ฝ ์๋์ ๊ฐ์ด ๋์ผํ ์ถ๋ฐ, ๋์ฐฉ ๋์ ์กฐ๊ฑด์์ ์์ ์๊ฐ์ด ๋ ํฐ ๊ฒ์ด ๋จผ์ buses={}์ append๋๋ค๋ฉด, ํ์ ์์ ์๊ฐ์ด ํฐ ๋ฒ์ค ๊ฒฝ๋ก๋ฅผ ํ์ํ ํ, ๋ ์ ์ ์์ ์๊ฐ์ ๋ฒ์ค ๊ฒฝ๋ก๋ฅผ ํ์ํ์ง ์๋๋ค.
2
3
1 2 5
1 2 10
1 2 3
1 2
(์ด๋ฅผ ์๊ฒ ๋ ์ง๋ฌธ ๊ฒ์ํ์ ๊ฒ์๋ฌผ)
sorted๋ก buses์ ๋ฐฐ์ด ์ ๋ ฌํ ํ, ํ์ํ๊ธฐ
์ด ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ ๊ฐ ์ถ๋ฐ ๋์์ ๋ฒ์ค ๊ฒฝ๋ก๋ฅผ cost ์์ผ๋ก ์ ๋ ฌํ ํ, ํ์ํ๊ณ ์ ํ์๋ค.
์ด๋ก ์ ์ผ๋ก๋ ๋ง๊ธดํ๋, ์๊ฐ ์ด๊ณผ๋ก ์ค๋ต ์ฒ๋ฆฌ๋์๋ค.
visited๋ฅผ ์์ค ๋ค์ต์คํธ๋ผ๋ฅผ ๊ตฌํ
start ๊ทธ๋ํ ๋ ธ๋์ ๋น์ฉ์ด ์ต์์ผ ๋, end ๊ทธ๋ํ ๋ ธ๋์ ๋น์ฉ์ ํ์ฌ ์ต์ ๋น์ฉ๊ณผ ๋น๊ตํ ํ ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ์์ผ๋ก visited๋ฅผ ์ฌ์ฉํ์ง ์๋, ๋นํจ์จ์ ์ธ ํ์์ ๋ฐฉ์งํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์๊ณ , ์ ๋ต ์ฒ๋ฆฌ๋์๋ค.
์ด ์ฝ๋๋ ์๋์ ๊ฒ์๋ฌผ์ ์ฝ๋๋ก๋ถํฐ ๋ง์ ๋์์ ๋ฐ์๋ค!
from heapq import heappush, heappop
import sys
input=sys.stdin.readline
N=int(input().rstrip())
M=int(input().rstrip())
buses={}
for i in range(1, N+1):
buses[i]=[]
for _ in range(M):
start, end, cost=map(int, input().rstrip().split())
buses[start].append((cost, start, end))
start, end=map(int, input().rstrip().split())
a_start, a_end=start, end
min_cost=[100000001 for _ in range(N+1)]
min_cost[start]=0
heap=[]
heappush(heap, (0, start, start))
while heap:
cost, start, end=heappop(heap)
c_cost=cost+min_cost[start]
if min_cost[end]<c_cost:
continue
for bus in buses[end]:
n_cost, n_start, n_end=bus
if min_cost[n_end]>min_cost[n_start]+n_cost:
min_cost[n_end]=min_cost[n_start]+n_cost
heappush(heap, bus)
print(min_cost[a_end])
[ํ์/๋ค์ต์คํธ๋ผ] ๋ฐฑ์ค 1916 ์ต์๋น์ฉ ๊ตฌํ๊ธฐ - ํ์ด์ฌ(Python)
[ Contents ] 1. ๋ฌธ์ (๋งํฌ ์ฐธ์กฐ) 1916๋ฒ: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ ์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N(1 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ ๋ฒ์ค์ ๊ฐ์ M(1 ≤ M ≤ 100,000)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์งธ ์ค๋ถํฐ M+2์ค๊น์ง ๋ค
star7sss.tistory.com
+์ง๋ฌธ ๊ฒ์ํ์, ๋ฐ๋ก๋ก ์ฌ๋ผ์จ ๊ฒ๋ค ์ค, ๋ฌธ์ ์ ๋ ฅ ์กฐ๊ฑด์ ๋ง์ง ์๋ ๊ฒ๋ค์ด ์์๋๋ฐ ๊ทธ๋งํผ ๋ง์ ๋ํฌํจ ๋ง์ ์ฌ๋๋ค์ ๋ฌธ์ ์ ์ ๋ ฅ ์กฐ๊ฑด์ ๋์น๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ์ค๋ต์ผ๋ก ๊ณ ์ํ๋ ๊ฒ์ด ๋ฌธ์ ์ ์ ๋ ฅ ์กฐ๊ฑด์ ๋์ณค๊ธฐ ๋๋ฌธ์ธ๋งํผ ๋ง์ฝ ๋์ ์ฝ๋๊ฐ ํ๋ ธ๋ค๋ฉด, ์ ์ถ๋ ฅ ์์๋ฅผ ๊ณ ์ํ๊ณ ํ ์คํธํด๋ณด์.
๊ฐ์ ์๊ณ ๋ฆฌ์ฆ๋ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ฐ๋ผ, ๊ตฌํ ์์์ ์ฑํ/๋น์ฑํ์ด ๋ฌ๋ผ์ง๋ค.
์ ์ถ ์ฝ๋๊ฐ ์ค๋ต์ธ ๊ฒฝ์ฐ, ์ ๋ ฅ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธํด๋ณด์.