728x90
๐๏ธ ๋ฌธ์
๐ Point
Bellman-Ford Algorithm
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋จ์ผ ์ถ๋ฐ์ ์ต๋จ ๊ฒฝ๋ก(SSSP, Single Source Shortest Path)๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ค์ต์คํธ๋ผ์ ๋ฌ๋ฆฌ ์์ ๊ฐ์ค์น๋ฅผ ํฌํจํ ๊ทธ๋ํ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ.
๊ธฐ๋ณธ ์ฝ๋
def bellman_ford(V, edges, start):
# ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ (๋ฌดํ๋)
INF = float('inf')
dist = [INF] * V
dist[start] = 0 # ์์ ์ ์ ๊ฑฐ๋ฆฌ = 0
# (V-1)๋ฒ ๋ชจ๋ ๊ฐ์ ํ์ธ
for _ in range(V - 1):
for u, v, w in edges:
if dist[u] != INF and dist[u] + w < dist[v]:
dist[v] = dist[u] + w
# ์์ ์ฌ์ดํด ํ์ธ
for u, v, w in edges:
if dist[u] != INF and dist[u] + w < dist[v]:
return "Negative Cycle Detected"
return dist
# ์์ ๊ทธ๋ํ (์ ์ 5๊ฐ, ๊ฐ์ 6๊ฐ)
V = 5
edges = [
(0, 1, 4),
(0, 2, 5),
(1, 2, -2),
(1, 3, 6),
(2, 3, 1),
(3, 4, -3)
]
start = 0
print(bellman_ford(V, edges, start))
# ๊ฒฐ๊ณผ
[0, 4, 2, 3, 0]
๐ ์ฝ๋
def bellman(V, edges, start):
INF = float('inf') # ๋ฌดํ๋ ๊ฐ์ ์ค์ ํ์ฌ ์ด๊ธฐ ๊ฑฐ๋ฆฌ ๊ฐ์ผ๋ก ์ฌ์ฉ
dist = [INF] * (V+1) # ๋ชจ๋ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ๋๋ก ์ด๊ธฐํ
dist[start] = 0 # ์์ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ์ค์
# ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์ํ (V๋ฒ ๋ฐ๋ณต)
for _ in range(V):
for u, v, w in edges: # ๋ชจ๋ ๊ฐ์ (u → v, ๊ฐ์ค์น w)์ ๋ํด ์
๋ฐ์ดํธ ์๋
if dist[u] != INF and dist[u] + w < dist[v]:
dist[v] = dist[u] + w # ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๊ฑฐ๋ฆฌ ๊ฐฑ์
# ์์ ์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ ํ์ธ
for u, v, w in edges:
if dist[u] != INF and dist[u] + w < dist[v]:
return -1 # ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด -1 ๋ฐํ
# ๋๋ฌํ ์ ์๋ ์ ์ ์ ๊ฑฐ๋ฆฌ ๊ฐ์ -1๋ก ๋ณ๊ฒฝ
for i in range(V+1):
if dist[i] == INF:
dist[i] = -1
return dist # ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ๋ฐํ
def main():
N, M = map(int, input().split()) # ์ ์ ์ N, ๊ฐ์ ์ M ์
๋ ฅ
edges = [tuple(map(int, input().split())) for _ in range(M)] # ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ๋ก ์ ์ฅ
start = 1 # ์์ ์ ์ ์ 1๋ฒ์ผ๋ก ๊ณ ์
dist = bellman(N, edges, start) # ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ์คํ
if dist == -1:
print(dist) # ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด -1 ์ถ๋ ฅ
else:
print(*dist[2:], sep='\n') # 2๋ฒ ์ ์ ๋ถํฐ ์ถ๋ ฅ (1๋ฒ ์ ์ธ)
if __name__ == "__main__":
main()
โ๐ป ํ์ด
์๊ฐ ๋ณต์ก๋ : O(VM)
- ์ด๊ธฐํ
- dist ๋ฐฐ์ด์ ์์ฑํ์ฌ ๋ชจ๋ ์ ์ ์ ์ต๋ค ๊ฑฐ๋ฆฌ๋ฅผ INF(๋ฌดํ๋)๋ก ์ค์ ํ๋ค.
- ์์ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์ ํ๋ค. (dist[start] = 0)
- V๋ฒ ๋ฐ๋ณตํ์ฌ ๊ฑฐ๋ฆฌ ๊ฐฑ์
- ๋ชจ๋ ๊ฐ์ ์ ํ์ธํ๋ฉฐ, ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ณด๋ค ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค.
- ์ต๋จ ๊ฒฝ๋ก๋ ์ต๋ V๋ฒ ๋ฐ๋ณตํ๋ฉด ๋ณด์ฅ๋๋ค. (for _ in range(V))
- ํด๋น ๋์๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ํ์ธ
- edges๋ฅผ ํ ๋ฒ ๋ ๋๋ฉด์, dist[u] + w < dist[v]๊ฐ ์ฑ๋ฆฝํ๋ฉด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒ์ด๋ค.
- ๋ชจ๋ ์ ์ ์ด ๋ฌดํํ ๊ฐ์ํ ์ ์์ผ๋ฏ๋ก -1์ ๋ฐํํ๋ค.
- (๋ฌธ์ ์์ ๋ค์ ๋ถ๋ถ์ ํด๋น)
- ๋ง์ฝ 1๋ฒ ๋์์์ ์ถ๋ฐํด ์ด๋ค ๋์๋ก ๊ฐ๋ ๊ณผ์ ์์ ์๊ฐ์ ๋ฌดํํ ์ค๋ ์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ค๋ฉด ์ฒซ์งธ ์ค์ -1์ ์ถ๋ ฅํ๋ค.
- ๋๋ฌํ ์ ์๋ ์ ์ ์ฒ๋ฆฌ
- ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ ์ ์ ์ -1๋ก ๋ณํํ๋ค.
- ๊ฒฐ๊ณผ ๋ฐํ
- dist = -1์ด๋ฉด, -1์ ๋ฐํํ๋ค.
- dist != -1์ด๋ฉด, 2๋ฒ ๋์๋ถํฐ ์ต๋จ ๊ฒฝ๋ก(dist[i])๋ฅผ ๋ฐํํ๋ค.
728x90
'coding_test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ฐ์ฌ ๊ฒ์ (ํ์ด์ฌ) (0) | 2025.03.05 |
---|---|
[๋ฐฑ์ค] 11719. ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ (ํ์ด์ฌ) (0) | 2025.03.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ๋ด p์ y์ ๊ฐ์ (ํ์ด์ฌ) (1) | 2025.02.26 |
[๋ฐฑ์ค] 17070. ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 (ํ์ด์ฌ) (0) | 2024.06.20 |
[๋ฐฑ์ค] 3019. ํ ํธ๋ฆฌ์ค (ํ์ด์ฌ) (0) | 2024.05.31 |