์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 22
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๊ทธ๋ํ ํ์ - ์๊ฐ๋ณต์ก๋
- ์ต์ ์ ์ฅ ํธ๋ฆฌ - 1
๋ค์ต์คํธ๋ผ ์๊ฐ๋ณต์ก๋
- ๋ชจ๋ ๋
ธ๋์์ ์ธ์ ๋
ธ๋์ ๊ฐ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ฒดํฌ : $O(E)$
๊ฐ ๊ฐ์ ์ ๋ํด ํ๋ฒ์ฉ ํ์ํ๊ธฐ ๋๋ฌธ - ์ฐ์ ์์ ํ์ 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๋ก, ๋ชจ๋ ๊ฐ์ ์ ์์ ๊ฐ๋ค.(์ฌ์ง์์ ๋นจ๊ฐ ์ค ์น ๋ถ๋ถ)
์ ์ฅ ํธ๋ฆฌ(Spanning Tree)
์คํจ๋ ํธ๋ฆฌ(์ ์ฅํธ๋ฆฌ)๋ ์ด๋ค ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง ๋,
ํด๋น ๊ทธ๋ํ์ ๋ชจ๋ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋๋ฉด์, ํธ๋ฆฌ์ ์์ฑ์ ๋ง์กฑํ๋ ๊ทธ๋ํ๋ค.
์ ์ฅํธ๋ฆฌ๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด
- ์๋ ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจ
- ๋ชจ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋จ
- ์ฌ์ดํด์ด ์๊ธฐ์ง ์์์ผํจ
ํ ๊ทธ๋ํ์์ ๋ํ๋ผ ์ ์๋ ์ฌ๋ฌ๊ฐ์ง ์คํจ๋ ํธ๋ฆฌ๋ค
์ต์ ์ ์ฅ ํธ๋ฆฌ (Minimum Spanning Tree, MST)
MST๋ ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ต์ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ(Kruskal)
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ(Prim)
๋ง์ง๋ง
7์ผ์ ํฌ์คํธ ์์ฑํ๊ณ , ํจ์บ ์ ์ ์ฌ๋ ธ๋ค๊ฐ ์ฑ๋ฆฐ์ง ๋๊ธธ๋ปํ๋ค.
๊น๋ฐํ์ง ๋ง์์ผ์ง :)
๋๊ธ๋จ๊ธฐ๊ธฐ