๐Ÿš— ์ตœ๋‹จ ๊ฒฝ๋กœ

๊ฒฝ์ดยท2023๋…„ 5์›” 14์ผ
0

๐Ÿš— ์ตœ๋‹จ ๊ฒฝ๋กœ

  • ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„

๐Ÿš— ๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(V^2)
import sys 
input = sys.stdin.readline
INF = int(1e9)

n, m = map(int, input().split()) # n, m ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ
start = int(input()) # ์‹œ์ž‘๋…ธ๋“œ ์ž…๋ ฅ

graph = [[] for i in range(n+1)] # ๋…ธ๋“œ๊ฐœ์ˆ˜ + 1๊ฐœ์˜ ๊ทธ๋ž˜ํ”„ ๋งŒ๋“ค๊ธฐ(0์€ ๋น„์›Œ์ฃผ๊ณ  1๋ถ€ํ„ฐ 6๊นŒ์ง€ ์ฆ‰ 7๊ฐœ ์ƒ์„ฑ)
visited = [False]*(n+1) # ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ n+1๊ฐœ ์ƒ์„ฑ
distance = [INF]*(n+1) # ๊ฑฐ๋ฆฌ ๋˜ํ•œ n+1๊ฐœ ์ƒ์„ฑ inf๋กœ ์ดˆ๊ธฐํ™”

# ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
  a, b, c = map(int, input().split())
  graph[a].append((b,c)) # ์ด n๊ฐœ์˜ ๋…ธ๋“œ์— ๊ฐ๊ฐ ์ •๋ณด ์ถ”๊ฐ€

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
def get_smallest_node():
  min_value = INF
  index = 0 # ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ ์งง์€ ๋…ธ๋“œ
  for i in range(1, n+1):
    # ๋งŒ์•ฝ i๋ฒˆ ๋…ธ๋“œ๊ฐ€ min_value๋ณด๋‹ค ์ž‘๊ณ , ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์•—๋‹ค๋ฉด
    if distance[i] < min_value and not visited[i]:
      min_value = distance[i] # min_value ๊ฐ’ ์—…๋ฐ์ดํŠธ
      index = i
  print(index)
  return index

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ -> ์‹œ์ž‘๋…ธ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›์Œ
def dijkstra(start):
  distance[start] = 0 # ์‹œ์ž‘๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  visited[start] = True # ๋“ค์–ด์˜จ ์‹œ์ž‘๋…ธ๋“œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
  # ์ง€๊ธˆ ๋…ธ๋“œ๋กœ ๊ฐ€์„œ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ distance ๋ฐฐ์—ด์— ๋‹ด์Œ
  for j in graph[start]:
    distance[j[0]] = j[1] # ๋ชฉ์ ์ง€ ๋…ธ๋“œ j[0], ๊ฑฐ๋ฆฌ j[1]
  # ๋ฐฉ๋ฌธ ์‹œ์ž‘
  for i in range(n-1):
    now = get_smallest_node() # get_smallest_node()์—์„œ ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ ์งง์€ ๋…ธ๋“œ ๋ฐ˜ํ™˜
    visited[now] = True # ๊ฑฐ๋ฆฌ ์งง์€๊ฑฐ ๋ฐ˜ํ™˜ํ•ด์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    for j in graph[now]:
      cost = distance[now] + j[1]
      if cost < distance[j[0]]:
        distance[j[0]] = cost

dijkstra(start)

for i in range(1, n+1):
  if distance[i] == INF:
    print("infinity")
  else:
    print(distance[i])

๐Ÿš— ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

import heapq
import sys
input = sys.stdin.readline
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([], (0, start))
  distance[start] = 0
  print(type(q))
  while q:
    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("INF")
  else:
    print(distance)

๐Ÿš— ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • DP ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N$^3$)
INF = int(1e9)

n = int(input())
m = int(input())

# ์ •๋ณด๋ฅผ ๋‹ด์„ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
graph = [[INF] * (n+1) for _ in range(n+1)]

# ์ž๊ธฐ ์ž์‹  -> ์ž๊ธฐ์ž์‹  ๋น„์šฉ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for i in range(1, n+1):
  for j in range(1, n+1):
    if i == j:
      graph[i][j] = 0

# ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ
for _ in range(m):
  a, b, c = map(int, input().split())
  graph[a][b] = c

for k in range(1, n+1): # ํ˜„์žฌ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋…ธ๋“œ
  for i in range(1, n+1): # ์ถœ๋ฐœ ์ •์ 
    for j in range(1, n+1): # ๋„์ฐฉ ์ •์ 
      graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])

for i in range(1, n+1):
  for j in range(1, n+1):
    if graph[i][j] == INF:
      print("INF")
    else:
      print(graph[i][j], end=' ')
  print()
profile
์ด์‚ฌ์ค‘์ž…๋‹ˆ๋‹ค!๐ŸŒŸhttps://velog.io/@devkyoung2

0๊ฐœ์˜ ๋Œ“๊ธ€