
벨λ§-ν¬λ(Bellman-Ford) μκ³ λ¦¬μ¦μ μμ κ°μ€μΉλ₯Ό κ°μ§ κ·Έλνμμλ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύμ μ μλ μκ³ λ¦¬μ¦μΌλ‘, λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦κ³Ό ν¨κ» μ΅λ¨ κ²½λ‘ μκ³ λ¦¬μ¦μ μλ μ°λ§₯μ μ΄λ£¨κ³ μμ΅λλ€. μ΄λ² ν¬μ€νΈμμλ 벨λ§-ν¬λ μκ³ λ¦¬μ¦μ μ리, μκ° λ³΅μ‘λ, λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦κ³Όμ λΉκ΅, μμ μ¬μ΄ν΄ κ²μΆ μ리, μν κ³Όμ , κ·Έλ¦¬κ³ νμ΄μ¬ μ½λ ꡬνκΉμ§ μμΈν μμλ³΄κ² μ΅λλ€.
벨λ§-ν¬λ μκ³ λ¦¬μ¦μ λ¨μΌ μΆλ°μ μμ λͺ¨λ μ μ κΉμ§μ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύλ μκ³ λ¦¬μ¦μ λλ€. νΉν, μμ κ°μ€μΉλ₯Ό κ°μ§ κ°μ μ΄ μ‘΄μ¬νλ κ·Έλνμμλ μ¬μ© κ°λ₯νλ©°, μμ μ¬μ΄ν΄(Negative Cycle)μ μ‘΄μ¬ μ¬λΆκΉμ§ κ²μΆν μ μμ΅λλ€.
벨λ§-ν¬λ μκ³ λ¦¬μ¦μ λ€μκ³Ό κ°μ μλ¦¬λ‘ λμν©λλ€:
μ΄κΈ°ν: μΆλ° μ μ μ 거리λ₯Ό 0μΌλ‘ μ€μ νκ³ , λλ¨Έμ§ λͺ¨λ μ μ μ 거리λ₯Ό 무νλ(β)λ‘ μ€μ ν©λλ€.
κ°μ μν(Edge Relaxation):
λͺ¨λ κ°μ μ λν΄ λ€μ κ³Όμ μ λ°λ³΅ν©λλ€.
for i from 1 to V - 1:
for each edge (u, v) with weight w:
if distance[u] + w < distance[v]:
distance[v] = distance[u] + w
μ΄ κ³Όμ μ κ·Έλνμ μ μ μ(V) - 1λ² λ°λ³΅λ©λλ€.
μμ μ¬μ΄ν΄ κ²μΆ:
λͺ¨λ κ°μ μ ν λ² λ κ²μ¬νμ¬, κ±°λ¦¬κ° λ μ€μ΄λλ κ°μ μ΄ μλ€λ©΄ μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ€κ³ νλ¨ν©λλ€.
for each edge (u, v) with weight w:
if distance[u] + w < distance[v]:
Negative Cycle Detected π¨
| νΉμ± | λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ | 벨λ§-ν¬λ μκ³ λ¦¬μ¦ |
|---|---|---|
| κ°μ€μΉ 쑰건 | λΉμμ κ°μ€μΉ | μμ κ°μ€μΉ νμ© |
| μκ° λ³΅μ‘λ | O(V + E log V) (μ°μ μμ ν μ¬μ© μ) | O(V * E) |
| μμ μ¬μ΄ν΄ κ²μΆ | λΆκ°λ₯ | κ°λ₯ |
| μ©λ | λΉ λ₯Έ κ³μ°μ΄ νμν λ μ¬μ© | μμ κ°μ€μΉλ μμ μ¬μ΄ν΄μ΄ μμ λ μ¬μ© |
거리(distance)μ μ΄μ μ μ (predecessor) μ΄κΈ°ν
distance = {vertex: float('inf') for vertex in vertices}
predecessor = {vertex: None for vertex in vertices}
distance[start] = 0
V - 1λ² λ°λ³΅νλ©° λͺ¨λ κ°μ μν
for _ in range(len(vertices) - 1):
for edge in edges:
u = edge.source
v = edge.target
w = edge.weight
if distance[u] + w < distance[v]:
distance[v] = distance[u] + w
predecessor[v] = u
μΆκ°λ‘ ν λ² λ κ°μ μν μλ
for edge in edges:
u = edge.source
v = edge.target
w = edge.weight
if distance[u] + w < distance[v]:
print("μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν©λλ€. β οΈ")
return None
class Edge:
def __init__(self, source, target, weight):
self.source = source # μμ μ μ
self<.target = target # λμ°© μ μ
self.weight = weight # κ°μ€μΉ
def bellman_ford(vertices, edges, start):
# 거리 λ° μ΄μ μ μ μ΄κΈ°ν
distance = {vertex: float('inf') for vertex in vertices}
predecessor = {vertex: None for vertex in vertices}
distance[start] = 0
# κ°μ μν λ°λ³΅
for _ in range(len(vertices) - 1):
for edge in edges:
u = edge.source
v = edge.target
w = edge.weight
if distance[u] + w < distance[v]:
distance[v] = distance[u] + w
predecessor[v] = u
# μμ μ¬μ΄ν΄ κ²μΆ
for edge in edges:
u = edge.source
v = edge.target
w = edge.weight
if distance[u] + w < distance[v]:
print("μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν©λλ€. β οΈ")
return None
return distance, predecessor
# μ¬μ© μμ
vertices = ['A', 'B', 'C', 'D', 'E']
edges = [
Edge('A', 'B', 6),
Edge('A', 'C', 7),
Edge('B', 'C', 8),
Edge('B', 'D', 5),
Edge('B', 'E', -4),
Edge('C', 'D', -3),
Edge('C', 'E', 9),
Edge('D', 'B', -2),
Edge('E', 'D', 7),
Edge('E', 'A', 2)
]
start_vertex = 'A'
result = bellman_ford(vertices, edges, start_vertex)
if result:
distances, predecessor = result
for vertex in vertices:
print(f"{start_vertex}μμ {vertex}κΉμ§μ μ΅λ¨ 거리: {distances[vertex]}")
# κ²½λ‘ μΆλ ₯
path = []
current_vertex = vertex
while current_vertex is not None:
path.insert(0, current_vertex)
current_vertex = predecessor[current_vertex]
print(f"κ²½λ‘: {' -> '.join(path)}")
else:
print("μμ μ¬μ΄ν΄λ‘ μΈν΄ μ΅λ¨ 거리λ₯Ό κ³μ°ν μ μμ΅λλ€. β")
source), λμ°© μ μ (target), κ°μ€μΉ(weight)λ₯Ό μ μ₯ν©λλ€.vertices), κ°μ 리μ€νΈ(edges), μμ μ μ (start)distance)μ μ΄μ μ μ (predecessor)bellman_ford ν¨μλ₯Ό νΈμΆν©λλ€.Aμμ AκΉμ§μ μ΅λ¨ 거리: 0
κ²½λ‘: A
Aμμ BκΉμ§μ μ΅λ¨ 거리: 2
κ²½λ‘: A -> C -> D -> B
Aμμ CκΉμ§μ μ΅λ¨ 거리: 7
κ²½λ‘: A -> C
Aμμ DκΉμ§μ μ΅λ¨ 거리: 4
κ²½λ‘: A -> C -> D
Aμμ EκΉμ§μ μ΅λ¨ 거리: -2
κ²½λ‘: A -> C -> D -> B -> E
λ§μ½ κ·Έλνμ μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλλ‘ κ°μ μ μΆκ°νλ€λ©΄:
edges.append(Edge('D', 'A', -10))
μμ μ¬μ΄ν΄ νμ±: Dμμ Aλ‘ κ°λ κ°μ μ κ°μ€μΉκ° -10μ΄ λμ΄ μμ μ¬μ΄ν΄μ΄ μμ±λ©λλ€.
κ²μΆ κ²°κ³Ό:
μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν©λλ€. β οΈ
μμ μ¬μ΄ν΄λ‘ μΈν΄ μ΅λ¨ 거리λ₯Ό κ³μ°ν μ μμ΅λλ€. β
벨λ§-ν¬λ μκ³ λ¦¬μ¦μ μμ κ°μ€μΉκ° μλ κ·Έλνμμλ μμ νκ² μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύμ μ μμΌλ©°, μμ μ¬μ΄ν΄μ μ‘΄μ¬ μ¬λΆκΉμ§ κ²μΆν μ μμ΅λλ€. λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦κ³Ό λΉκ΅νμ¬ μκ° λ³΅μ‘λλ λμ§λ§, κ·Έλ§νΌ μ μ© λ²μκ° λμ΅λλ€.
π μ°Έκ³ μλ£
μ΄ ν¬μ€νΈκ° 벨λ§-ν¬λ μκ³ λ¦¬μ¦μ μ΄ν΄νλ λ° λμμ΄ λμ ¨κΈΈ λ°λλλ€. π μ§λ¬Έμ΄λ μΆκ° μ€λͺ μ΄ νμνμλ©΄ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ! π