ํฐ์คํ ๋ฆฌ ๋ทฐ
[๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ] ํ ์ด๋ ์ดํดํ๋ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(Bellman-Ford Algorithm)
10000COW 2022. 12. 5. 20:23๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋?
ํ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ edge(๊ฐ์ )์ด ์์ ๋ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ?
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ๋งค๋ฒ ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋ ์ค์์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋๊ฐ๋ค.
- ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ edge(๊ฐ์ )์ด ์๋ค๋ฉด ์ต์ ์ ํด๋ฅผ ์ฐพ์ ์ ์๋ค.
- ์๊ฐ ๋ณต์ก๋๊ฐ ๋น ๋ฅด๋ค.
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋งค ๋จ๊ณ๋ง๋ค ๋ชจ๋ edge(๊ฐ์ )์ ์ ๋ถ ํ์ธํ๋ฉด์ ๋ชจ๋ ๋ ธ๋๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋๊ฐ๋ค.
- ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ edge๊ฐ ์์ด๋ ์ต์ ์ ํด๋ฅผ ์ฐพ์ ์ ์๋ค.
- ์๊ฐ ๋ณต์ก๋๊ฐ ๋๋ฆฌ๋ค.
์ฆ, ๋ชจ๋ edge์ ๊ฐ์ค์น๊ฐ ์์์ผ ๋๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์,
์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ edge๊ฐ ์กด์ฌํ๋ฉด ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ง์ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ณด์!
STEP 0.
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ์.
๊ทธ๋ฆฌ๊ณ , ์ถ๋ฐ์ง ๋ ธ๋(์ฌ๊ธฐ์ '์ง'์ ์ถ๋ฐ์ง๋ก ๊ฐ์ ํ๋ค)๋ก๋ถํฐ ๊ฐ ๋ ธ๋๊น์ง ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๋ ํ๋ฅผ ๋ง๋ ๋ค.
์ด ํ๋ฅผ ์์ผ๋ก ์ค๋ช ์ ํธ์๋ฅผ ์ํด distance๋ผ๊ณ ํ๊ฒ ๋ค.
์ฐ์ ์ ๋ชจ๋ ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ๋๋ก ์ค์ ํด ๋์. ๊ทธ๋ฆฌ๊ณ ์ถ๋ฐ์ง์ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊พผ๋ค(์ถ๋ฐ์ง์์ ์ถ๋ฐ์ง๋ ๊ฑฐ๋ฆฌ๊ฐ 0์ด๋ฏ๋ก)
์ด์ ๋ถํฐ (์ด ๋ ธ๋์ ๊ฐ์ - 1)๋งํผ Cycle์ ๋๋ฉด์ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์๋ณด์!
Cycle 1.
edge๋ฅผ ์ต๋ 1๊ฐ๊น์ง ์จ์ ๊ฐ ์ ์๋ ๋ ธ๋๊น์ง ๋ฐฉ๋ฌธํด์, ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํ๋ค. (๋นจ๊ฐ์ ๊ฐ์ ์ด edge 1๊ฐ๋ฅผ ์จ์ ์ด๋ํ ๊ฒ์ ๋ํ๋ธ๋ค)
ํ์ฌ ์ถ๋ฐ์ง์ธ ์ง์์ edge 1๊ฐ๋ฅผ ์จ์ ์ด๋ํ ์ ์๋ ๊ณณ์ ํ๊ต์ ๋งํธ์ด๋ค.
๊ฐ๊ฐ ํ๊ต๋ -1 ๋งํผ, ๋งํธ๋ 4๋งํผ ๊ฐ์ค์น(๊ฑฐ๋ฆฌ)๊ฐ ๋ค๊ณ , ๋ฌดํ๋๋ณด๋ค ์์ผ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ๊ฐ๊ฐ ๋ฐ๊ฟ์ค๋ค.
Cycle 2.
edge๋ฅผ ์ต๋ 2๊ฐ๊น์ง ์จ์ ๊ฐ ์ ์๋ ๋ ธ๋๊น์ง ๋ฐฉ๋ฌธํด์, ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํ๋ค.
Cycle 3.
edge๋ฅผ ์ต๋ 3๊ฐ๊น์ง ์จ์ ๊ฐ ์ ์๋ ๋ ธ๋๊น์ง ๋ฐฉ๋ฌธํด์, ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํ๋ค.
Cycle 4.
edge๋ฅผ ์ต๋ 4๊ฐ๊น์ง ์จ์ ๊ฐ ์ ์๋ ๋ ธ๋๊น์ง ๋ฐฉ๋ฌธํด์, ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํ๋ค.
๋ฒจ๋ง-ํฌ๋ Python ์ฝ๋
def bellman_ford(graph, start):
distance = dict()
for node in graph:
#distance[node]๋ ํด๋น node๊น์ง ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ
distance[node] = float('inf')
distance[start] = 0
V = len(graph) # ๋
ธ๋ ๊ฐ์
print("distance:",distance)
print("------start------")
for _ in range(V-1):
# edge ๋น๊ต (edge์๋ <์ถ๋ฐ ๋
ธ๋, ๋์ฐฉ ๋
ธ๋, ๊ฑฐ๋ฆฌ(๊ฐ์ค์น)>๊ฐ ์์ผ๋ฏ๋ก dictionary์์ edge ์ ๋ณด๋ฅผ for๋ฌธ์ผ๋ก ๊บผ๋ด์๋ค)
for node in graph:
print("-------node--:", node)
for neighbor in graph[node]:
# ์ง๊ธ๊น์ง์ neighbor๊น์ง์ ๊ฑฐ๋ฆฌ๋ณด๋ค, ํ์ฌ ์ ์ (node)๋ฅผ ๊ฑฐ์ณ neighbor๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์์ ๊ฒฝ์ฐ
if distance[neighbor] > distance[node] + graph[node][neighbor]:
distance[neighbor] = distance[node] + graph[node][neighbor]
print("distance:",distance)
print(f'{_+1}์ฌ์ดํด ๋\n')
# ์์ ์ฌ์ดํด ํ๋ณ
for node in graph:
for neighbor in graph[node]:
if distance[neighbor] > distance[node] + graph[node][neighbor]:
return -1
return distance
์งํ ๊ณผ์ ๋ฐ ์ถ๋ ฅ ๊ฒฐ๊ณผ
distance: {'์ง': 0, 'ํ๊ต': inf, '๋งํธ': inf, '๋ฐ๋ฌผ๊ด': inf, '์ํ๊ด': inf}
predecessor: {'์ง': None, 'ํ๊ต': None, '๋งํธ': None, '๋ฐ๋ฌผ๊ด': None, '์ํ๊ด': None}
------start------
-------node--: ์ง
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': inf, '๋ฐ๋ฌผ๊ด': inf, '์ํ๊ด': inf}
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': 4, '๋ฐ๋ฌผ๊ด': inf, '์ํ๊ด': inf}
-------node--: ํ๊ต
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': 4, '๋ฐ๋ฌผ๊ด': 1, '์ํ๊ด': inf}
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': 4, '๋ฐ๋ฌผ๊ด': 1, '์ํ๊ด': 0}
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': 2, '๋ฐ๋ฌผ๊ด': 1, '์ํ๊ด': 0}
-------node--: ๋งํธ
-------node--: ๋ฐ๋ฌผ๊ด
distance: {'์ง': 0, 'ํ๊ต': -1, '๋งํธ': 2, '๋ฐ๋ฌผ๊ด': 1, '์ํ๊ด': -2}
-------node--: ์ํ๊ด
1์ฌ์ดํด ๋
-------node--: ์ง
-------node--: ํ๊ต
-------node--: ๋งํธ
-------node--: ๋ฐ๋ฌผ๊ด
-------node--: ์ํ๊ด
2์ฌ์ดํด ๋
-------node--: ์ง
-------node--: ํ๊ต
-------node--: ๋งํธ
-------node--: ๋ฐ๋ฌผ๊ด
-------node--: ์ํ๊ด
3์ฌ์ดํด ๋
-------node--: ์ง
-------node--: ํ๊ต
-------node--: ๋งํธ
-------node--: ๋ฐ๋ฌผ๊ด
-------node--: ์ํ๊ด
4์ฌ์ดํด ๋
์๊ฐ ๋ณต์ก๋
(๋ ธ๋์ ๊ฐ์ - 1) Cycle์ ๋๊ณ , ๊ฐ Cycle๋ง๋ค ๋ชจ๋ Edge๋ฅผ ํ์ธํ๋ฏ๋ก
๋ ธ๋์ ๊ฐ์๋ฅผ V๋ผ๊ณ ํ๊ณ , Edge์ ๊ฐฏ์๋ฅผ E๋ผ๊ณ ํ๋ฉด,
์๊ฐ๋ณต์ก๋๋ O( |V-1|*|E| ) = O ( |V||E|)
๊ณต๊ฐ ๋ณต์ก๋
๊ฐ ๋ ธ๋๋ง๋ค ๋งค ์๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ๊ณต๊ฐ ๋ณต์ก๋๋ O(|V|)
'๐ง๐ปโ๐ป ์๊ณ ๋ฆฌ์ฆ > ๊ทธ๋ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- DOM
- Context API
- react
- ๋ฆฌ์กํธ
- Component
- state
- ์๋ฃ๊ตฌ์กฐ
- Browser
- JavaScript
- ์๋ฌ
- git
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ทธ๋ํ
- BOJ
- github
- leetcode
- DB
- useState
- React Query
- ์ ๋ ฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ํจ์
- Python
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ด์ฌ
- mdn
- error
- ๋ธ๋ผ์ฐ์
- CSS
- zustand
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |