์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 21
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๊ทธ๋ํ ์ต๋จ ๊ฒฝ๋ก - 2
- ๋ค์ต์คํธ๋ผ - 1
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋๋ฐ,
๊ทธ ์ค ๊ฐ์ฅ ๊ฐ์ ๋ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ๊ฒ์ด๋ค.
- ์ด๊ธฐํ : ์์์ ์์ ๋ชจ๋ ๋ ธ๋๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋น์ฉ์ ๋ฌดํ๋๋ก ์ด๊ธฐํ
- ์์ : ์์๋ ธ๋๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋น์ฉ์ 0์ผ๋ก ์ค์ , ์ฐ์ ์์ ํ์ ๋ฃ๋๋ค.
- ์ฐ์ ์์ ํ์์ ๊ฐ์ฅ ์์ ์๋ ๊ฐ์ ๊บผ๋ด ํ์ฌ ๋ ธ๋๋ก ์ง์
- ํ์ฌ ๋
ธ๋์์ ๋ค์ ๋
ธ๋(์ธ์ ๋
ธ๋์ค ํ๋)๋ก ๊ฐ๋ ๋น์ฉ์ด
๊ธฐ์กด์ ๋ค์ ๋ ธ๋๊น์ง ๊ฐ๋๋ฐ ๋๋ ๋น์ฉ๋ณด๋ค ์ ์ผ๋ฉด ๋น์ฉ์ ์ ๋ฐ์ดํธํ๊ณ , ์ฐ์ ์์ ํ์ ๋ฃ๋๋ค. - 3 ~ 4๋ฅผ ๋ฐ๋ณตํ๋ค.
์ด๋ ์ฐ์ ์์ ํ ๊ตฌํ์ ์ต์ ํ์ ์ฌ์ฉํ๋ค.
๋ค์ต์คํธ๋ผ ๊ตฌํ
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')
๋
ธ๋ 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')
๋๊ธ๋จ๊ธฐ๊ธฐ