intro
๐งฟ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด๋ '๋ฐฉํฅ ๊ทธ๋ํ ๋๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ํ๋์ ์์์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ'์ด๋ค. ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ ์ ์ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ผ์ผ์ด ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ. ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์์์ธ ๊ฐ์ ์กด์ฌ๋ ๊ด์ฐฎ์ง๋ง ์์์ธ ์ฌ์ดํด์ด ์์ ๋๋ง ๋ฌธ์ ์ด๋, ๋ค์ต์คํธ๋ผ๋ ์์์ธ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ๊ฐ์ ์ด ์์ผ๋ฉด ์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ. ์์์ธ ๊ฐ์ ์ด ์๋ค๋ฉด ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ. ๋ํ ์ ํํ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๊ทผ์ฌ์น๋ฅผ ์ํ ๊ฒฝ์ฐ A* ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํจ. ๋ค์ต์คํธ๋ผ๋ ๋คํธ์ํฌ์์๋ ๋ง์ด ์ฌ์ฉ.
๐งฟ ์ผ๋ช '์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ' ์ค ํ๋๋ก, ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ํฉ์ (1) ํ ์ง์ ์์ ๋ค๋ฅธ ํ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก (2) ํ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก (3) ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก ์ด๋ ๊ฒ 3๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ๋ค์ต์คํธ๋ผ๋ (2)์ด๋ฉฐ, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ → ๋งค ์ํฉ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํด ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ๋ํ, A → C๊น์ง ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ฐ์ ์ผ๋ก A → B๋ก ๊ฐ ์ผ์ด์ค์์ B → C ๊น์ง ์ด๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋, ๊ธฐ๋ณธ์ ์ผ๋ก DP์ ์๋ฆฌ๊ฐ ๋ค์ด๊ฐ ์๊ณ ๋ฆฌ์ฆ. ๋ค์ต์คํธ๋ผ๋ ์์์ธ ๊ฐ์ ์ด ์์ ๊ฒฝ์ฐ ๋์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ํ์ค ์ธ๊ณ์์ ๋๋ก(๊ฐ์ )๊ฐ ์์ ๊ฐ์ ์ผ๋ก ํํ๋์ง ์๋ ์ ์ผ๋ก ๋ฏธ๋ฃจ์ด ๋ณด์ ํ์ค์ธ๊ณ์ ์ ์ฉ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐งฟ ์๊ณ ๋ฆฌ์ฆ ๋์ ๊ณผ์
โ ์ถ๋ฐ ๋ ธ๋ ์ค์
โก ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ด๊ธฐํ: ์ฒ์์ ๋ชจ๋ ๋ ธ๋๊น์ง ๊ฐ๊ธฐ ์ํ ๋น์ฉ ๋ฌดํ๋ ์ค์ , ์๊ธฐ ์์ (์ถ๋ฐ ๋ ธ๋)์ 0์ผ๋ก ์ค์
โข <๊ทธ๋ฆฌ๋> ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ค์์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋
ธ๋ ์ ํ
(์ด ๋, ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ ํ ๋ฒ ์ฒ๋ฆฌ๋ ๋
ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๊ณ ์ ๋์ด ๋ ์ด์ ๋ฐ๋์ง ์๋๋ค. ํ ๋จ๊ณ๋น ํ๋์ ๋
ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์คํ ์ฐพ๋ ๊ฒ์ผ๋ก ์ดํด)
โฃ <dp> (์ ์ ํํ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์) ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
โค ์ ๊ณผ์ ์์ โข๊ณผ โฃ๊ณผ์ ์ ๋ฐ๋ณต. ์ดํ ๋ชจ๋ ์ํํ๋ฉด ํ ์ด๋ธ์ ์ถ๋ฐ ๋ ธ๋์์ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
implementation
โ without using Priority Queue
๐งฟ ๊ตฌ์ฒด ๊ณผ์
โ ๊ทธ๋ํ ์ค๋น / ์ถ๋ฐ ๋ ธ๋ ์ค์ / ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ค์
โก ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋์ธ 1๋ฒ ๋ ธ๋(๊ฑฐ๋ฆฌ 0) ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ๋ ธ๋ 1์์ ์ธ์ ํ ๋ ธ๋๋ค ์ค ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ(๋ ธ๋ 2์ ๋ ธ๋ 3๊ณผ ๋ ธ๋4): ๊ธฐ์กด ํ ์ด๋ธ ๊ฐ๊ณผ ๋ ธ๋1๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ์ ๊ฐ์ ๊ฑฐ๋ฆฌ ํฉ ๋ ๊ฐ๋ฅผ ๋น๊ตํด์ ์ต์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ
โข ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ 3๋ฒ ์ ํ → 3๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ์ธ์ ๋ ธ๋ 4๋ฒ ๋ ธ๋ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ(ํ์ฌ 3๋ฒ ๋ ธ๋ ์ต๋จ๊ฑฐ๋ฆฌ 2 + ๊ฐ์ 2์ ํฉ 4๊ฐ 5๋ณด๋ค ์์ผ๋ฏ๋ก 4๋ก ์ ๋ฐ์ดํธ)
โฃ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ 2๋ฒ ์ ํ → 2๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ์ธ์ ๋ ธ๋ 5๋ฒ ๋ ธ๋ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ(ํ์ฌ 2๋ฒ ๋ ธ๋ ์ต๋จ๊ฑฐ๋ฆฌ 3 + ๊ฐ์ 8์ ํฉ 11์ด inf๋ณด๋ค ์์ผ๋ฏ๋ก 11๋ก ์ ๋ฐ์ดํธ)
โค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ 4๋ฒ ์ ํ → 4๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ์ธ์ ๋ ธ๋ 5๋ฒ ๋ ธ๋ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ(ํ์ฌ 4๋ฒ ๋ ธ๋ ์ต๋จ๊ฑฐ๋ฆฌ 4 + ๊ฐ์ 6์ ํฉ 10์ด 11๋ณด๋ค ์์ผ๋ฏ๋ก 10์ผ๋ก ์ ๋ฐ์ดํธ)
โฅ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ 5๋ฒ ์ ํ → 5๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ์ธ์ ๋ ธ๋ 6๋ฒ ๋ ธ๋ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ(ํ์ฌ 5๋ฒ ๋ ธ๋ ์ต๋จ๊ฑฐ๋ฆฌ 10 + ๊ฐ์ 1์ ํฉ 11์ด inf๋ณด๋ค ์์ผ๋ฏ๋ก 11๋ก ์ ๋ฐ์ดํธ)
โฆ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ 6๋ฒ ์ ํ → 6๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + ์ธ์ ๋ ธ๋ 6๋ฒ ๋ ธ๋๊ฐ ์๊ณ ๋ฐฉ๋ฌธ ์ํ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก ์ข ๋ฃ
๐งฟ python code
import sys
input=sys.stdin.readline
INF = int(1e9)
n,m=map(int,input().split()) #node number, line number
start=int(input()) #start node
graph=[[]for i in range(n+1)] #graph list
visited=[False]*(n+1)
distance=[-1]+[INF]*(n) #shortest-path distance arr
#forms graph
for _ in range(m):
a,b,c=map(int,input().split())
graph[a].append((b,c)) #node a -> node b (cost c)
#returns the smallest paths of node among non-visited
def get_smallest_node():
min_value=INF
index=0 #the smallest node's index
for i in range(1,n+1):
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
index = i
return index
def dijkstra(start):
distance[start] = 0 #initialize 0 in start node in sp distance arr
visited[start] = True
for j in graph[start]:
distance[j[0]] = j[1] #update sp arr starting from start node
for _ in range(n-1): #n-1 times (start node operated above)
now = get_smallest_node()
visited[now] = True
for j in graph[now]: #update sp arr starting from each node
cost = distance[now] + j[1]
if cost < distance[j[0]]:
distance[j[0]] = cost
dijkstra(start)
print(distance) #print sp arr table
๐งฟ ๋ฌธ์ ์ : ๋งค ๋ฒ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ์ํด์ผ ํ๋ค(์ get_smallest_node() ํจ์). ๋ฐ๋ผ์ ์ ์ฝ๋๋ table update๋ฅผ ์ํ ๋ชจ๋ ๋ ธ๋ ํ์ + ๋งค ํ์ ์ ํ์ ์์ ๋ ธ๋๋ฅผ ์ ํ๊ธฐ ์ํ get_smallest_node() ์ด๋ ๊ฒ O(V*V)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค. (V๋ ๊ฐ์ ์ ๊ฐ์). ์ผ๋ฐ์ ์ผ๋ก ์ ์ฒด ๋ ธ๋์ ๊ฐ์๊ฐ 5,000๊ฐ ์ดํ๋ผ๋ฉด ์ ์ฝ๋๋ก ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ. ํ์ง๋ง ๋ ธ๋์ ๊ฐ์๊ฐ 10,000๊ฐ๋ฅผ ๋์ด๊ฐ๋ค๋ฉด TLE.
โก using Priority Queue
๐งฟ ๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ํจ์จ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ํด์๋ ์ฐ์ ์์ ํ(Priority Queue) ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ(ํฌ์คํ ์ฐธ์กฐ). ์ฐ์ ์์ ํ๋ '์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์ ํ๋ ์๋ฃ๊ตฌ์กฐ'. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ฅผ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์๋ค๊ฐ ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ถํฐ ๊บผ๋ด์ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฐ์ ์์ ํ ์ฌ์ฉ. ์ฐ์ ์์ ํ์๋ ์ต์ ํ(min heap)๊ณผ ์ต๋ ํ(max heap) ์กด์ฌ. ์ต์ ํ์ ๊ฐ์ด ๋ฎ์ ๋ฐ์ดํฐ๋ถํฐ ๋จผ์ ์ญ์ . ์ต๋ ํ์ ๊ฐ์ด ๋์ ๋ฐ์ดํฐ๋ถํฐ ๋จผ์ ์ญ์ . ๋ฐ์ดํฐ ์ฝ์ ๊ณผ ์ญ์ ์ ๋ชจ๋ O(logn).
๐งฟ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์์ '๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ ๊ณผ์ ' get_smallest_node()์ ์๊ณ ๋ฆฌ์ฆ ์๊ฐ๋ณต์ก๋๋ฅผ ์ฐ์ ์์ ํ๋ก ๊ฐ์ ํ ์ ์๋ค. ํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํด์ผ ํ๋ฏ๋ก ์ต์ ํ ์ฌ์ฉ.
โ ๊ทธ๋ํ ์ค๋น / ์ถ๋ฐ ๋ ธ๋ ์ค์ / ์ต๋จ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ค์ / ์ฐ์ ์์ ํ์ ์ถ๋ฐ ๋ ธ๋ ์ฝ์
โก ์ฐ์ ์์ ํ์์ ์์ ๊บผ๋. 1๋ฒ ๋ ธ๋๋ ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ. 1๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ 2๋ฒ ๋ ธ๋ / 3๋ฒ ๋ ธ๋ / 4๋ฒ ๋ ธ๋ ์ต๋จ ๊ฑฐ๋ฆฌ update. ์ธ ๊ฐ ๋ ธ๋ ๋ชจ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋์์ผ๋ฏ๋ก ์ฐ์ ์์ ํ์ ์ฝ์ .
โข ์ฐ์ ์์ ํ์์ ์์ ๊บผ๋. 3๋ฒ ๋ ธ๋๋ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ. 3๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ 4๋ฒ ๋ ธ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ. 4๋ฒ ๋ ธ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋์์ผ๋ฏ๋ก ์ฐ์ ์์ ํ์ ์ฝ์ .
โฃ ๊ณ์ํด์ ์ฐ์ ์์ ํ์์ ์์ ๊บผ๋. 2๋ฒ ๋ ธ๋ ์ญ์ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๊ณ ์ฐ๊ฒฐ ๋ ธ๋ 5๋ฒ์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ฐ์ดํธ ๋ค, ์ฐ์ ์์ ํ์ 5๋ฒ ๋ ธ๋๋ฅผ ์ ๋ฐ์ดํธํ ์ต๋จ๊ฑฐ๋ฆฌ์ ํจ๊ป ์ฝ์ .
โค ๊ณ์ํด์ ์ฐ์ ์์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ 4์ธ ๋ ธ๋ 4๋ฅผ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๋ค, ์ฐ๊ฒฐ ๋ ธ๋ 5๋ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ 10์ผ๋ก ์ ๋ฐ์ดํธ ํ๊ณ ์ฐ์ ์์ ํ์ ์ฝ์ .
โฅ ์ฐ์ ์์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ 5์ธ ๋ ธ๋ 4๋ฅผ ๊บผ๋์ผ๋, ๋ ธ๋ 4๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ์ผ๋ฏ๋ก ํจ์ค. ๊ฑฐ๋ฆฌ๊ฐ 10์ธ ๋ ธ๋ 5๋ฅผ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๋ค, ์ฐ๊ฒฐ ๋ ธ๋ 6๋ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ 11๋ก ์ ๋ฐ์ดํธ ํ๊ณ ์ฐ์ ์์ ํ์ ์ฝ์ .
โฆ ์ฐ์ ์์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ 11์ธ ๋ ธ๋ 5๋ฅผ ๊บผ๋์ผ๋ ๋ ธ๋ 5๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ์ผ๋ฏ๋ก ํจ์ค. ๊ฑฐ๋ฆฌ๊ฐ 11์ธ ๋ ธ๋ 6์ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๋ค, ๋ ธ๋ 6์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์์ผ๋ฏ๋ก ํจ์ค. ์ฐ์ ์์ ํ์ ๋๊ธฐ ์ค์ธ ๋ ธ๋ ์์ผ๋ฏ๋ก ์ข ๋ฃ.
๐งฟ python code
โป ์ฃผ์: ์ฐ์ ์์ ํ์์ ๊บผ๋ธ (๊ฑฐ๋ฆฌ, ๋ ธ๋) ์์ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐ๊ณผ ๋น๊ตํ ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ์ฌ๋ถ ๊ฒ์ฌ๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐ๊ณผ ๊ฐ์ ์ง / ๋ค๋ฅธ ์ง์ ์ฌ๋ถ๋ก ๊ฒ์ฌ (๋ฐ๋ก visited list ๋ง๋ค ํ์ x)
โป ์ฃผ์: ๋จ๋ฐฉํฅ์ธ์ง / ์๋ฐฉํฅ์ธ์ง ๊ตฌ๋ถ. ์๋ฐฉํฅ์ด๋ผ๋ฉด graph[a]์ graph[b] ๊ฐ๊ฐ apppend ํ์
import sys
import heapq
input=sys.stdin.readline
INF = int(1e9)
n,m=map(int,input().split()) #node number, line number
start=int(input()) #start node
graph=[[]for _ in range(n+1)] #graph list
distance=[-1]+[INF]*(n) #shortest-path distance arr
#forms graph
for _ in range(m):
a,b,c=map(int,input().split())
graph[a].append((b,c)) #node a -> node b (cost c)
def dijkstra(start):
q = [] #priority-queue
heapq.heappush(q, (0, start)) #(shortest distance, node number)
distance[start] = 0 #initialize 0 in start node in sp distance arr
while q:
cur_dist, cur_node = heapq.heappop(q) #get the shortest dist with node
if cur_dist <= dist_table[cur_node]: #if not visited
for next_node in graph[cur_node]: #BFS
next_node_number, next_node_dist = next_node[0], next_node[1]
cost = cur_dist + next_node_dist #get cost(current + next dist)
if cost < distance[next_node_number]: #if should it be updated
distance[next_node_number] = cost #update
heapq.heappush(q,(cost,next_node_number)) #insert in PQ
dijkstra(start)
print(*distance[1:]) #print sp arr table(from node 1)
๐งฟ ์ฐ์ ์์ ํ ๊ด์ ์ผ๋ก ๋ณด์์ ๋ ๊ฐ์ 1๊ฐ๋น ์ต๋ 1๊ฐ์ ์์๊ฐ ์ฐ์ ์์ ํ์ ์ถ๊ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(ElogE). ์์ ์ฐ์ ์์ ํ ์ฌ์ฉ์ด ์๋ ์๊ฐ ๋ณต์ก๋๋ O(V^2)๋ก, E๊ฐ V^2์ ๊ฐ๊น๋ค๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋น์ทํด, ์ฐ์ ์์ ํ ์ฌ์ฉ์ ํจ๊ณผ๊ฐ ์์ผ๋ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ์์๋ V๋ฅผ ํฌ๊ฒ ๋๊ณ (์ฆ, ๋ ธ๋์ ๊ฐ์๋ฅผ ํฌ๊ฒ ๋๊ณ ), E๋ V^2๊น์ง ์๊ฐ๊ฒ๋ (๊ฐ์ ์ ๊ฐ์๋ ์๊ฒ) ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ์๊ด x
โข Dijkstra path ๊ฒฝ๋ก ์ถ๋ ฅํ๊ธฐ
'Computer Science > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ฆ Pigeonhole Principle (0) | 2024.02.02 |
---|---|
๐ Backtracking (0) | 2024.01.18 |
๐LIS(Longest Increasing Subsequence) O(n^2)/O(nlogn) (0) | 2024.01.06 |
๐กKadane's Algorithm (0) | 2024.01.03 |
๐ฌ Parametric Search (1) | 2023.12.31 |
๋๊ธ