์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋‚ด์šฉ์ •๋ฆฌ (4)
์ฝ”๋”ฉํ…Œ์ŠคํŠธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋‚ด์šฉ์ •๋ฆฌ (4)

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜


- ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธํ•œ๋‹ค.

- '๊ธธ์ฐพ๊ธฐ' ๋ฌธ์ œ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ

- ๊ฐ ์ง€์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ '๋…ธ๋“œ'๋กœ ํ‘œํ˜„๋˜๊ณ , ์ง€์  ๊ฐ„ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ '๊ฐ„์„ '์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. 

 

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜


- ๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

- ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

<์›๋ฆฌ>

(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 ํŒŒ์ด์ฌ. ํ•œ๋น›๋ฏธ๋””์–ด