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

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

  1. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ - ์‹œ๊ฐ„๋ณต์žก๋„
  2. ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ - 1

๋‹ค์ต์ŠคํŠธ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„

  1. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ธ์ ‘ ๋…ธ๋“œ์— ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ฒดํฌ : $O(E)$
    ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•ด ํ•œ๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ
  2. ์šฐ์„ ์ˆœ์œ„ ํ์— push/pop : $O(E log E)$
    ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ๊ฐ„์„ ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š”๋ฐ, ๊ฐ ๊ฐ„์„ ๋“ค์„ ํ•œ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ตœ๋Œ€ $O(E)$,
    $O(E)$๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ์„๋•Œ, ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ $O(log E)$๋กœ
    โ€œ๋…ธ๋“œ์˜ ์ˆ˜ * ์šฐ์„ ์ˆœ์œ„ ํ ์‹œ๊ฐ„๋ณต์žก๋„โ€๊ฐ€ ๋œ๋‹ค. -> $O(E * log E)$
    ๋”ฐ๋ผ์„œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(E) + O(E log E) = O(E log E)$ ์ด๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ๋…ธ๋“œ/๊ฐ„์„  ๋ฐฉ๋ฌธํšŸ์ˆ˜ ํ™•์ธ

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])
    visitedEdgeCnt = 0 # ๋ฐฉ๋ฌธํ•œ ๊ฐ„์„  ์ˆ˜ ์ดˆ๊ธฐํ™”
    while q:
        curDist, curNode = heapq.heappop(q)
        if distance[curNode] < curDist: # ์ตœ์ ํ™”
            continue
        print("visit : ", curNode) # ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ (์ตœ์ ํ™”๋กœ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค)
        visitedEdgeCnt += len(graph[curNode]) # ๋ฐฉ๋ฌธํ•œ ๊ฐ„์„  ์ˆ˜ ๊ณ„์‚ฐ
        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, visitedEdgeCnt]
                
dijkstra(graph, 'A', 'F')

๋…ธ๋“œ ๋ฐฉ๋ฌธ์€ A์—์„œ F๊นŒ์ง€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ–ˆ๋‹ค.
๊ฐ™์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ด๋ฏธ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ,
์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐ„์„  ๋ฐฉ๋ฌธ ํšŸ์ˆ˜๋Š” 9๋กœ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ์ˆ˜์™€ ๊ฐ™๋‹ค.(์‚ฌ์ง„์—์„œ ๋นจ๊ฐ„ ์ค„ ์นœ ๋ถ€๋ถ„)

dijkstra

์‹ ์žฅ ํŠธ๋ฆฌ(Spanning Tree)

์ŠคํŒจ๋‹ ํŠธ๋ฆฌ(์‹ ์žฅํŠธ๋ฆฌ)๋Š” ์–ด๋–ค ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ,
ํ•ด๋‹น ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด์„œ, ํŠธ๋ฆฌ์˜ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ๊ทธ๋ž˜ํ”„๋‹ค.

์‹ ์žฅํŠธ๋ฆฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด

  • ์›๋ž˜ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จ
  • ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋จ
  • ์‚ฌ์ดํด์ด ์ƒ๊ธฐ์ง€ ์•Š์•„์•ผํ•จ

ํ•œ ๊ทธ๋ž˜ํ”„์—์„œ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋“ค
st

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (Minimum Spanning Tree, MST)

mst

MST๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค.

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Kruskal)
  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Prim)

๋งˆ์ง€๋ง‰

7์ผ์— ํฌ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ณ , ํŒจ์บ ์— ์•ˆ ์˜ฌ๋ ธ๋‹ค๊ฐ€ ์ฑŒ๋ฆฐ์ง€ ๋Š๊ธธ๋ป”ํ–ˆ๋‹ค.
๊นœ๋ฐ•ํ•˜์ง€ ๋ง์•„์•ผ์ง€ :)

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