Algorithm

[๋ฐฑ์ค€] 1753. ์ตœ๋‹จ ๊ฒฝ๋กœ python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 1753๋ฒˆ ์ตœ๋‹จ๊ฒฝ๋กœ

๐Ÿ• ๋ฌธ์ œ

๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ฃผ์–ด์ง„ ์‹œ์ž‘์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1โ‰คVโ‰ค20,000, 1โ‰คEโ‰ค300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1โ‰คKโ‰คV)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ๊ฐ„์„ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ (u, v, w)๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” u์—์„œ v๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜ w์ธ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. u์™€ v๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋ฉฐ w๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ •์  ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค.

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

์ฒ˜์Œ์— ํ’€์ด๋Š”, ์ธ์ ‘ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด์„œ dfs๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ๋Œ๋ฉด์„œ cost๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ณ , ๊ฐ€์žฅ ์ž‘์€ cost๋ฅผ result๋ฐฐ์—ด์— ์ €์žฅํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๊ณ , ๊ฒฐ๊ตญ ๊ฒ€์ƒ‰ ๋์— dijkstra ๋ฐ heap, ๊ทธ๋ฆฌ๊ณ  ์ธ์ ‘ํ–‰๋ ฌ ๋Œ€์‹  ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค!!

๋จผ์ € ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ [index, cost]๋ฅผ graph[start]์— ๋„ฃ์–ด์ฃผ๊ณ , dijkstra๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์ด๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
๋จผ์ € dist๋ผ๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ ๋’ค, dist[k]์—๋Š” 0์„ ๋„ฃ์–ด์ค€๋‹ค.(์กฐ๊ฑด)
heapq์— (์ดํ•˜ hq) [cost,node]๋ฅผ ๋„ฃ์–ด์ค€ ๋’ค, cost๊ฐ€ ์ตœ์†Œ์ธ ๋…ธ๋“œ๋ฅผ hq์—์„œ popํ•˜๋ฉฐ ๋น„๊ตํ•ด์ค€๋‹ค. cost๊ฐ€ dist[node]์˜ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด continue๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น node์˜ ์ด์›ƒ์„ ํƒ์ƒ‰ํ•˜๋ฉฐ cost๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๋˜ํ•œ ์—ฌ๊ธฐ์„œ, ์ฃผ์˜ํ•  ์ ์ด ์›๋ž˜ ํ•ญ์ƒ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ๋ถ„๋ฆฌ์‹œํ‚ฌ ๋•Œ map๊ณผ input์„ ํ™œ์šฉํ–ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋œฐ ์ค„์€ ์ƒ์ƒ๋„ ๋ชปํ–ˆ๋‹ค! ๐Ÿ˜… sys.stdin.readline().split()์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.. input์ด ๋” ๋Š๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค!

solution ์ฝ”๋“œ

  1. ์ธ์ ‘๋ฆฌ์ŠคํŠธ ๋ฐ dijkstra๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๊ณตํ•œ ์ฝ”๋“œ
  import sys, heapq
  sys.stdin = open("input.txt","rt")
  inf = float('inf')

  def dijkstra(v,k,graph):  
  dist = \[inf for \_ in range(v+1)\]  
  dist\[k\] = 0

  hq = []
  heapq.heappush(hq, [0,k]) #heapq์— [cost,node]๋ฅผ ๋„ฃ์Œ

  while hq:
      temp = heapq.heappop(hq) #cost๊ฐ€ ์ตœ์†Œ์ธ ๋…ธ๋“œ
      cost = temp[0]
      node = temp[1]

      if cost > dist[node]:
          continue

      for i in graph[node]:
          neighbor = i[0]
          cost_i = dist[node] + i[1]

          if cost_i < dist[neighbor]:
              dist[neighbor] = cost_i
              heapq.heappush(hq, [cost_i, neighbor])
  return dist


  v, e = \[int(x) for x in sys.stdin.readline().split()\]  
  k = int(input())  
  graph = \[\[\] for \_ in range(v)\]  
  for \_ in range(e):  
  start, end, weight = \[int(x) for x in sys.stdin.readline().split()\]  
  graph\[start\].append(\[end,weight\])

  answer = dijkstra(v,k,graph)

  for dis in answer\[1:\]:  
  print(dis if dis != inf else 'INF')
  1. ์ธ์ ‘ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋˜ ์ฝ”๋“œ...
import sys
sys.setrecursionlimit(10**5)
sys.stdin = open("input.txt","rt")

def dfs(node, target, value):
    if node == target:
        if result[target] == -1:
            result[target] = value
        if result[target] > value:
            result[target] = value
    else:
        for i in range(v):
            if graph[node][i] != 0 and visit[node] == 0:
                visit[node] = 1
                dfs(i,target,value + graph[node][i])
                visit[node] = 0



if __name__ == "__main__":
    v, e = map(int,input().split())
    k = int(input())
    k -= 1

    graph = [[0] * v for _ in range(v)]
    for i in range(e):
        start, end, weight = map(int,input().split())
        graph[start-1][end-1] = weight

    result = [-1] * v
    visit = [0] * v
    for i in range(v):
        if i != k:
            dfs(k,i,0)
        else:
            result[i] = 0

    for res in result:
        if res == -1:
            print("INF")
        else:
            print(res)