[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(dijkjstra) ์๊ณ ๋ฆฌ์ฆ์ด๋? with Python
- -
๐ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ์์ ํน์ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ๋ฌธ์
๋งค๋ฒ ์ต๋จ ๊ฒฝ๋ก์ ์ ์ ์ ์ ํํ์ฌ ํ์ ๋ฐ๋ณต
๐ฑ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ํน์ง
๋์ฐฉ๋ ธ๋๋ ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ธธ์ ์ฐพ์ ํ์๊ฐ ์๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ค์น๊ฐ ์์์ผ ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
โ ๋์ ๋จ๊ณ
1. ์ถ๋ฐ๋ ธ๋์ ๋์๋ ธ๋ ์ค์ ํด์ฃผ๊ณ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํํด์ค๋ค.
2. ํ์ฌ ์์น์์์ ์ธ์ ํ ๋ ธ๋๋ค ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ ๋ค,
๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํด์ค๋ค.
3. ํด๋น ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๋์ด๊ฐ๋ ๊ฐ์ ๋น์ฉ(๊ฐ์ค์น)๋ฅผ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธ ํด์ค๋ค.
4. 3~4๋ฒ ๊ณผ์ ๋ฐ๋ณต
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ : 1์ฐจ์ ๋ฐฐ์ด๋ก N๊ฐ ๋ ธ๋๊น์ง ์ค๋๋ฐ ํ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋ก // N๊ฐ ํฌ๊ธฐ์ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ํฐ ๊ฐ์ ๋ฃ์ด ์ด๊ธฐํ
- ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐฐ์ด : ํด๋น ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธํ ๋ ธ๋์ธ์ง ์๋์ง๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ฐฐ์ด๋ก, ์ ์ฒด ๋ฐฐ์ด์ ๋ฐฉ๋ฌธํ์ง ์์ False๋ก ๋๊ณ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ True๋ก ๋ณ๊ฒฝํด์ค๋ค.
โ ๋์ ์์
์ถ๋ฐ ๋ ธ๋๋ 1๋ฒ, ๋์ฐฉ ๋ ธ๋๋ 6๋ฒ
๊ฑฐ๋ฆฌํ ์ด๋ธ์ ํฐ ๊ฐ์ธ ๋ฌดํ๋๋ก ์ด๊ธฐํํด์ค๋ค.
๋ ธ๋๋ค์ ์๋ ์ค๊ฐ์๋ ๊ฐ์ ๋น์ฉ(๊ฐ์ค์น)๋ฅผ ์์ฑํด์ค๋ค.
์ถ๋ฐ ๋ ธ๋๋ฅผ 1, ๋์ฐฉ๋ ธ๋๋ฅผ 6์ผ๋ก ์ค์ ํด์ค๋ค, ์ถ๋ฐ๋ ธ๋์์ ์๊ธฐ ์์ ์ ๊ฑฐ๋ฆฌ๋ 0์ด๋ฏ๋ก ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์ ํด์ค๋ค.
1๋ฒ์์ ์ถ๋ฐํ ๋ ์ธ์ ๋ ธ๋๋ 2์ 4์ด๋ค. 1์์ 2๋ก ๊ฐ๋์ ๊ฐ์ 2, 1์์ 4๋ก ๊ฐ๋์ ๊ฐ์ 1์ด๋ค.
์ธ์ ๋ ธ๋๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์กด์ ๊ฑฐ๋ฆฌ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ต์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค. ์ธ์ ๋ ธ๋ 2๊น์ง ๊ฐ๋ ์ต์ ๊ฑฐ๋ฆฌ๋ 2์ inf ์ค์ 2, ์ธ์ ๋ ธ๋ 4๊น์ง ๊ฐ๋ ์ต์ ๊ฑฐ๋ฆฌ๋ 1๊ณผ inf์ค์ 1์ด๋ค.
๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธ ํด์ค ๋ค, ์ธ์ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ์ ๋ฐ์ดํธ ํ ๋ ธ๋ 1์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
๊ทธ ํ 1์์ ์ธ์ ๋ ธ๋๋ก ๊ฐ ๋ ๊ฑฐ๋ฆฌ๋น์ฉ์ด ์ ์ 4๋ฒ ๋ ธ๋๋ก ์ด๋ํ๋ค.
๋ ธ๋ 4์์ ๊ฐ ์ ์๋ ์ธ์ ๋ ธ๋๋ 2์ 5์ด๋ค.
4๋ฒ๊ณผ ์ฐ๊ฒฐ๋ 2, 5๋ฒ๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฉด, ๋จผ์ 4์์ 2๋ก ๊ฐ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด์ 1๋ฒ-> 4๋ฒ์ผ๋ก ์ฌ๋ ๊ฑฐ๋ฆฌ๋น์ฉ 1๊ณผ 4์์ 2๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋น์ฉ 2๋ฅผ ๋ํ 3์ด๋ค.
ํ์ง๋ง ๊ธฐ์กด์ ๋ ธ๋ 2๋ฒ์ ๊ฑฐ๋ฆฌ๋น์ฉ์ด 2๊ฐ ์๋๋ฐ, ์ด๋ 1์์ 2๋ก ๊ฐ๋์ ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ ๊ฐ์ด๋ค.
2์ 3์ ๋น๊ตํ์ ๋ ๊ฑฐ๋ฆฌ๋น์ฉ์ด 2๊ฐ ๋ ์ ๊ฒ ๊ฑธ๋ฆฌ๋ฏ๋ก ์ ๋ฐ์ดํธํด์ฃผ์ง ์๊ณ 2๋ฅผ ์ ์งํด์ค๋ค.
4๋ฒ-> 5๋ฒ ๋ ธ๋๋ก ๊ฐ ๋์๋ ์์ ๊ฐ์ด 1+ 1 = 2, ๊ฑฐ๋ฆฌ๋น์ฉ์ inf์ 2๋ฅผ ๋น๊ตํ์ ๋ ์ต์ ๊ฐ์ด 2๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.
๋ค์์ผ๋ก ๊ฐ ๋ ธ๋๋ ๊ฑฐ๋ฆฌ๊ฐ์ด ๊ฐ์ฅ ์์ 2๋ฒ ๋ ธ๋์ 5๋ฒ ๋ ธ๋ ์ค ํ๋์ด๋ค.
๊ฑฐ๋ฆฌ ๊ฐ์ด ๊ฐ์ ๋์๋ ์ธ๋ฑ์ค๊ฐ ์์ ๋ ธ๋์ธ 2๋ถํฐ ์ด๋ํด๋ณธ๋ค.
2๋ฒ๋ ธ๋์์ ์ธ์ ๋ ธ๋๋ 3๋ฒ, 4๋ฒ๋ ธ๋์ด๋ค.
2๋ฒ-> 4๋ฒ์ผ๋ก ๊ฐ๋์ ๊ฑฐ๋ฆฌ๋น์ฉ์ 2+2 = 4์ด๋ค.
๊ฑฐ๋ฆฌ๋น์ฉ 4์ ๊ธฐ์กด์ ๊ฑฐ๋ฆฌ๋น์ฉ 1์ ๋น๊ตํ์ ๋ ์ต์๊ฐ์ ๊ธฐ์กด ๊ฐ์ด๋ฏ๋ก ์ ๋ฐ์ดํธ ํด์ฃผ์ง ์๋๋ค.
2๋ฒ-> 3๋ฒ์ผ๋ก ์ด๋ํ ๋์ ๊ฑฐ๋ฆฌ๋น์ฉ์ 2+ 3 = 5์ด๋ค. ๊ธฐ์กด์ ๊ฑฐ๋ฆฌ๋น์ฉ inf์ 5๋ฅผ ๋น๊ตํ์์ ๋ ์ต์๊ฐ์ 5์ด๋ฏ๋ก 5๋ฒ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ 5๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.
๋ค์์ผ๋ก ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ 3,5,6๋ฒ ์ค ๊ฑฐ๋ฆฌ๋น์ฉ์ด ์์ 5๋ฒ์ผ๋ก ์ด๋ํด์ค๋ค.
5๋ฒ์์ ๊ฐ ์ ์๋ ์ธ์ ๋ ธ๋๋ 4๋ฒ๊ณผ 6๋ฒ์ด๋ค.
4๋ฒ์ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฐ์ดํธ ํ์ง์๋๋ค.
5๋ฒ-> 6๋ฒ ๋ ธ๋๋ก ์ด๋ํ ๋์๋ ๊ธฐ์กด ๋ ธ๋ 5๋ฒ์ ๊ฑฐ๋ฆฌ๋น์ฉ 2์ 5๋ฒ->6๋ฒ ์ด๋ํ ๋์ ๊ฑฐ๋ฆฌ๋น์ฉ 2๋ฅผ ๋ํ 4์ด๋ฏ๋ก , 6๋ฒ ํ ์ด๋ธ์ ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋น์ฉ inf์ ๋น๊ตํ์ ๋ 4๋ก ๊ฐฑ์ ํด์ค๋ค.
์ต์ข ์ ์ผ๋ก 1๋ฒ ๋ ธ๋์์ 6๋ฒ ๋ ธ๋ ๊น์ง ์ค๋๋ฐ ๊ฑฐ์น๋ ๋ ธ๋๋ 1-> 4-> 5-> 6 ์ด๊ณ , ์ต์ ๊ฑฐ๋ฆฌ๋น์ฉ์ 4์ด๋ค.
๐ ์๊ฐ ๋ณต์ก๋
๊ฐ์ ์ ์: E(Edge)
๋ ธ๋์ ์: V(Vertex)
=> O(E logV)
ํ๋์ ๊ฐ์ ์ ๋ํด์๋ O(logE)์ด๊ณ , ์ต์ ์ ๊ฒฝ์ฐ์ ๋ํด์๋ O(E logV)์ด๋ค.
๐ฉ๐ป๐ป ์ฝ๋ ๊ตฌํ
1. ๊ธฐ๋ณธ ๋์ - heapq ๋ฐฉ์
INF = int(1e9)
n,m=map(int,input().split())
start = int(input())
graph=[[] for i in range(n+1)]
distance=[INF]*(n+1)
for _ in range(m):
a,b,c = map(int, input().split())
graph[a].append((b,c))
def dijkstra(start):
q=[]
heapq.heappush(q,(0,start))
distance[start]=0
while q:
# ๊ฐ์ฅ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ์ฒ๋ฆฌ๋์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด pass
if distance[now]<dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์, ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]]:
distance[i[0]]=cost
heapq.heappush(q,(cost,i[0]))
dijkstra(start)
for i in range(1,n+1):
if distance[i]==INF:
print("INFINITY")
else:
print(distance[i])
2. ์ต๋จ ๊ฒฝ๋ก ์ถ์
mport heapq
INF = int(1e9)
n,m = 8,14 # ๋
ธ๋ ์
start = 1 # ์ถ๋ฐ ๋
ธ๋
graph=[[] for i in range(n+1)]
# ์ต๋จ๊ฑฐ๋ฆฌ + ๋ถ๋ชจ๋
ธ๋ ์ ์ฅ ํ
์ด๋ธ ์์ฑ
distance=[[INF,i] for i in range(n+1)]
# ์๋ฐฉํฅ ์
๋ ฅ
# ๋
ธ๋ a์ ๋
ธ๋ b์ ๋น์ฉ c
for _ in range(m):
a,b,c = map(int, input().split())
graph[a].append((b,c))
graph[b].append((a,c))
def dijkstra(start):
q=[]
heapq.heappush(q,(0,start))
distance[start][0]=0
while q:
# ๊ฐ์ฅ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ์ฒ๋ฆฌ๋์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด pass
if distance[now][0]<dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์, ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]][0]:
distance[i[0]][0]=cost # ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐฑ์
distance[i[0]][1]=now # ๋ถ๋ชจ๋
ธ๋ ์ ์ฅ
heapq.heappush(q,(cost,i[0]))
dijkstra(start)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
for i in range(1,n+1):
length,_= distance[i] # ์ต๋จ ๊ธธ์ด
parent_node=i
path=[]
while parent_node!=1:
path.append(parent_node)
_,parent_node = distance[parent_node]
distance[parent_node]
path.append(1)
print("%s๋ฒ ๋
ธ๋ : %s (%s)" % (i,">".join(map(str,path[::-1])),length))
1๋ฒ ๋ ธ๋ : 1 (0)
2๋ฒ ๋ ธ๋ : 1>2 (3)
3๋ฒ ๋ ธ๋ : 1>3 (4)
4๋ฒ ๋ ธ๋ : 1>3>4 (12)
5๋ฒ ๋ ธ๋ : 1>3>5 (9)
6๋ฒ ๋ ธ๋ : 1>2>6 (12)
7๋ฒ ๋ ธ๋ : 1>3>5>7 (13)
8๋ฒ ๋ ธ๋ : 1>2>6>8 (14)
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์คํ์ด๋? (0) | 2023.10.08 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ฐ๊ฒฐ๋ฆฌ์คํธ (0) | 2023.10.08 |
[์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ ์ํ (+์ฝ๋ ๊ตฌํ with Python) (0) | 2023.05.17 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋?(Greedy Algorithms) (0) | 2023.05.07 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] - ์ธํ์ ์ํ ๋ฌธ์ (Traveling Salesperson Problem, TSP) (0) | 2023.04.28 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค