์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธํ๋ค.
- '๊ธธ์ฐพ๊ธฐ' ๋ฌธ์ ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- ๊ฐ ์ง์ ์ ๊ทธ๋ํ์์ '๋ ธ๋'๋ก ํํ๋๊ณ , ์ง์ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๋ ๊ทธ๋ํ์์ '๊ฐ์ '์ผ๋ก ํํ๋๋ค.
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ์์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์์ ๋, ํน์ ํ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋๋ค.
<์๋ฆฌ>
(1) ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์ ํ๋ค.
(2) ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํ ํ๋ค.
(3) ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
(4) ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค.
(5) (3),(4)๋ฒ์ ๋ฐ๋ณตํ๋ค.
- '๊ฐ ๋ ธ๋์ ๋ํ ํ์ฌ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ' ์ ๋ณด๋ฅผ ํญ์ 1์ฐจ์ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ฉฐ ๋ฆฌ์คํธ๋ฅผ ๊ณ์ ๊ฐฑ์ ํ๋ค๋ ํน์ง์ด ์๋ค.
- ์ฐ์ ์์ ํ(heaq)๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฎ์ท๋ค.
import heapq
import sys
input=sys.stdin.readline
INF=int(1e9)
# ๋
ธ๋, ๊ฐ์ ์ ๊ฐฏ์
n,m=map(int,input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start=int(input())
# ๊ทธ๋ํ ์์ฑ
graph = [[] for _ 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=[]
# ์ด๊ธฐํ
# ์์๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ 0
heapq.heappush(q,(0,start)) # ๊ฑฐ๋ฆฌ์ ๋
ธ๋
distance[start]=0
while q:
# ์ต์ ํ์ด๋ฏ๋ก ์ต๋จ๊ฑฐ๋ฆฌ ๋
ธ๋๊ฐ pop
dist,now=heapq.heappop(q)
# ์ด๋ฏธ ์ฒ๋ฆฌ๋ ๋
ธ๋๋ผ๋ฉด
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])
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- A์์ B๋ก ๊ฐ๋ ์ต์ ๋น์ฉ๊ณผ A์์ K๋ฅผ ๊ฑฐ์ณ B๋ก ๊ฐ๋ ๋น์ฉ ์ค ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์
# ๋ฌดํ์ ์๋ฏธํ๋ ์์๊ฐ ์ค์
INF=int(1e9) # 1e9 == 10์ต
# ๋
ธ๋์ ๊ฐ์ ๋ฐ ๊ฐ์ ์ ๊ฐ์
n=int(input()) # ๋
ธ๋
m=int(input()) # ๊ฐ์
# 2์ฐจ์ ๋ฆฌ์คํธ ์์ฑ ๋ฐ ์ด๊ธฐํ
# ๋ฐฐ์ด์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ก ๋
ธ๋๋ฒํธ๋ก ์ฌ์ฉํ๊ธฐ ์ํด n+1๋ก ์ค์
graph = [[INF]*(n+1) for _ in range(n+1)]
# ์๊ธฐ์์ ->์๊ธฐ์์ ๊ฐ์ ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1,n+1):
for b in range(1,n+1):
if a==b:
graph[a][b]=0
# ๊ฐ์ ๋ฐ์ดํฐ ์
๋ ฅ
for _ in range(m):
a,b,c = map(int,input().split()) # a์์ b๋ก ๊ฐ๋ ๋น์ฉ์ c
graph[a][b]=c
# ์ ํ์์ ๋ฐ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
for k in range(1,n+1):
for a in range(1,n+1):
for b in range(1,n+1):
graph[a][b]=min(graph[a][b], graph[a][k]+graph[k][b])
# ์ถ๋ ฅ
for a in range(1,n+1):
for b in range(1,n+1):
if graph[a][b]==INF:
print("INF",end=" ")
else:
print(graph[a][b],end=' ')
print() # ์ค๋ฐ๊ฟ
์ฐธ๊ณ ๋ฌธํ ๋ฐ ์ถ์ฒ | ๋๋๋น. 2020. ์ด๊ฒ์ด ์ทจ์ค์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ. ํ๋น๋ฏธ๋์ด
'์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[KAKAO|์นด์นด์ค ๊ธฐ์ถ๋ฌธ์ ] ๋ฉ๋ด ๋ฆฌ๋ด์ผ (0) | 2021.04.21 |
---|---|
[KAKAO|์นด์นด์ค ๊ธฐ์ถ๋ฌธ์ ] ์ ๊ท ์์ด๋ ์ถ์ฒ (0) | 2021.04.21 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ์ ๋ฆฌ (3) (0) | 2021.03.11 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ์ ๋ฆฌ (2) (0) | 2021.02.20 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ ์ ๋ฆฌ (1) (2) | 2021.02.20 |