์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 21

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ ๊ฒฝ๋กœ - 2
  2. ๋‹ค์ต์ŠคํŠธ๋ผ - 1

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,
๊ทธ ์ค‘ ๊ฐ€์žฅ ๊ฐœ์„ ๋œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

  1. ์ดˆ๊ธฐํ™” : ์‹œ์ž‘์ ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”
  2. ์‹œ์ž‘ : ์‹œ์ž‘๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ 0์œผ๋กœ ์„ค์ •, ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ๋Š”๋‹ค.
  3. ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๊ฐ’์„ ๊บผ๋‚ด ํ˜„์žฌ ๋…ธ๋“œ๋กœ ์ง€์ •
  4. ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ๋…ธ๋“œ(์ธ์ ‘๋…ธ๋“œ์ค‘ ํ•˜๋‚˜)๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด
    ๊ธฐ์กด์— ๋‹ค์Œ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ๋ณด๋‹ค ์ ์œผ๋ฉด ๋น„์šฉ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ๋Š”๋‹ค.
  5. 3 ~ 4๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ด๋•Œ ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„์€ ์ตœ์†Œ ํž™์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ๊ตฌํ˜„

graph

graph = {
    'A': {'B': 8, 'C': 1, 'D': 2},
    'B': {},
    'C': {'B': 5, 'D': 2},
    'D': {'E': 3, 'F': 5},
    'E': {'F': 1},
    'F': {'A': 5}
}
def dijkstra(graph, start):
    distance = {node : math.inf for node in graph}
    q = []
    distance[start] = 0
    heapq.heappush(q, [0, start])
    while q:
        curDist, curNode = heapq.heappop(q)
        nextNodes = graph[curNode]
        for nextNode in nextNodes:
            if distance[nextNode] > curDist + graph[curNode][nextNode]:
                distance[nextNode] = curDist + graph[curNode][nextNode]
                heapq.heappush(q, [distance[nextNode], nextNode])
    return distance
dijkstra(graph, 'A')

dijkstra

๋…ธ๋“œ A๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ํƒ์ƒ‰ํ•˜๊ณ ,
๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ธฐ๋ณธ์ ์ธ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ์ ํ™”

์œ„ ๊ตฌํ˜„์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋น„์šฉ์€ ๋‹ค๋ฅด๊ณ  ์ค‘๋ณต๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ”์„ ๋•Œ,
์ธ์ ‘๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์ด ๋‘๋ฒˆ๋œ๋‹ค.
๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ 1, ๋น„์šฉ์ด ๋” ํฐ ๋…ธ๋“œ๋ฅผ 2๋ผ๊ณ  ํ•  ๋•Œ,
1๋ฒˆ์ด ๋จผ์ € ๊ณ„์‚ฐ๋˜์–ด ์ดํ›„ ๋น„์šฉ์ด 1๊ณผ ๊ฐ™๊ฒŒ ๋œ๋‹ค.
์ด๋ฅผ ์ด์šฉํ•ด ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ๊ธฐ์กด์— ๋“œ๋Š” ๋น„์šฉ๊ณผ ๋น„๊ตํ•˜์—ฌ,
๊ธฐ์กด์— ๋“œ๋Š” ๋น„์šฉ์ด ๋” ์‹ผ ๊ฒฝ์šฐ, ์ธ์ ‘๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๊ฑด๋„ˆ๋›ฐ๋„๋ก ํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ์˜ ํ˜„์žฌ ๋น„์šฉ๊ณผ, ๊ธฐ์กด ๋น„์šฉ์„ ๋น„๊ตํ•˜์—ฌ
ํ˜„์žฌ ๋น„์šฉ์ด ๋” ๋น„์‹ผ ๊ฒฝ์šฐ ๊ฑด๋„ˆ๋›ด๋‹ค.

def dijkstra(graph, start):
    distance = {node : math.inf for node in graph}
    q = []
    distance[start] = 0
    heapq.heappush(q, [0, start])
    while q:
        curDist, curNode = heapq.heappop(q)
        if distance[curNode] < curDist: # ์ตœ์ ํ™”
            continue
        nextNodes = graph[curNode]
        for nextNode in nextNodes:
            if distance[nextNode] > curDist + graph[curNode][nextNode]:
                distance[nextNode] = curDist + graph[curNode][nextNode]
                heapq.heappush(q, [distance[nextNode], nextNode])
    return distance

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ

def dijkstra(graph, start, end):
    distance = {node : math.inf for node in graph}
    prevNode = {node: None for node in graph}
    q = []
    distance[start] = 0
    prevNode[start] = start
    heapq.heappush(q, [0, start])
    while q:
        curDist, curNode = heapq.heappop(q)
        if distance[curNode] < curDist: # ์ตœ์ ํ™”
            continue
        nextNodes = graph[curNode]
        for nextNode in nextNodes:
            if distance[nextNode] > curDist + graph[curNode][nextNode]:
                distance[nextNode] = curDist + graph[curNode][nextNode]
                prevNode[nextNode] = curNode # "ํ˜„์žฌ๋…ธ๋“œ์—์„œ ๋‹ค์Œ๋…ธ๋“œ๋กœ ๊ฐ”๋‹ค"๋ฅผ ์ €์žฅ
                heapq.heappush(q, [distance[nextNode], nextNode])
    route = ''
    curNode = end
    while curNode != start:
        route += curNode + " <- "
        curNode = prevNode[curNode]
    route += curNode
    return [route, distance]
dijkstra(graph, 'A', 'F')

route

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ