2024. 2. 6. 18:44γCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.6 Greedy Algorithms - 3.6.3 Ford Fulkerson algorithm
Ford Fulkerson Algorithm
π‘Ford Fulkerson Algorithm is a greedy algorithm that is used to find the maximum flow in a flow network. It is also known as the Edmonds-Karp Algorithm.
ν¬λ νμ»€μ¨ μκ³ λ¦¬μ¦μ νλ¦ λ€νΈμν¬μμ μ΅λ νλ¦μ μ°Ύλ λ° μ¬μ©λλ νμ μκ³ λ¦¬μ¦μ λλ€. μλλ¨Όμ¦-μΉ΄ν μκ³ λ¦¬μ¦μ΄λΌκ³ λ ν©λλ€.
ν¬λ-ν컀μ¨(Ford-Fulkerson) μκ³ λ¦¬μ¦μ λ€νΈμν¬ νλ‘μ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ² μ€ νλμ λλ€.
μ΄ μκ³ λ¦¬μ¦μ μμ€ λ Έλμμ νκ² λ Έλλ‘μ μ΅λ νλ‘μ°λ₯Ό μ°Ύλ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
μ΄λ₯Ό μν΄, 'μ¦κ° κ²½λ‘(augmenting path)'λ₯Ό μ΄μ©νλλ°, μ¦κ° κ²½λ‘λ μμ€μμ νκ²μΌλ‘ μ΄μ΄μ§λ κ²½λ‘ μ€ μμ§ λ λ§μ νλ‘μ°λ₯Ό ν΅κ³Όμν¬ μ μλ κ²½λ‘λ₯Ό λ§ν©λλ€.
Ford Fulkerson μκ³ λ¦¬μ¦μ λμ μ리λ μ΄λ μ΅λλ€.
1. λͺ¨λ κ°μ μ νλ‘μ°λ₯Ό 0μΌλ‘ μ΄κΈ°νν©λλ€.
2. μ¦κ° κ²½λ‘κ° μ‘΄μ¬νλ λμ λ€μμ μμ
μ λ°λ³΅ν©λλ€.
3. μ¦κ° κ²½λ‘μ λν μ΅μ μμ¬ μ©λμ μ°Ύμ΅λλ€.
4. κ·Έ κ²½λ‘μ λν΄ μ΅μ μμ¬ μ©λλ§νΌ νλ‘μ°λ₯Ό μ¦κ°μν΅λλ€.
μ΄ κ³Όμ μ λ°λ³΅νλ©΄μ μμ€μμ νκ²μΌλ‘μ νλ‘μ°λ₯Ό μ΅λλ‘ λ§λλ κ²μ΄ Ford-Fulkerson μκ³ λ¦¬μ¦μ λͺ©νμ
λλ€.
In Python
from collections import defaultdict
class Graph:
def __init__(self, vertices):
self.verts = vertices # κ·Έλνμ μ μ μλ₯Ό μ μ₯ν©λλ€.
self.graph = [[0 for column in range(vertices)] for row in range(vertices)] # 2μ°¨μ λ°°μ΄μ μ¬μ©νμ¬ κ·Έλνλ₯Ό λνλ
λλ€.
# λλΉ μ°μ νμ(BFS)μ ν΅ν΄ μμ€μμ νκ²μΌλ‘ μ΄μ΄μ§λ κ²½λ‘κ° μλμ§ νμΈν©λλ€.
def BFS(self, s, t, parent):
visited =[False]*(self.verts) # λͺ¨λ μ μ μ λ°©λ¬Ένμ§ μμ μνλ‘ μ΄κΈ°νν©λλ€.
queue=[]
queue.append(s) # μμ€λ₯Ό νμ μΆκ°ν©λλ€.
visited[s] = True # μμ€λ₯Ό λ°©λ¬Έν μνλ‘ νμν©λλ€.
while queue:
u = queue.pop(0)
for ind, val in enumerate(self.graph[u]):
if visited[ind] == False and val > 0 : # λ°©λ¬Ένμ§ μμ μ μ κ³Ό μ©λμ΄ 0λ³΄λ€ ν° κ²½λ‘λ₯Ό μ°Ύμ΅λλ€.
queue.append(ind) # μ°Ύμ μ μ μ νμ μΆκ°ν©λλ€.
visited[ind] = True # μ°Ύμ μ μ μ λ°©λ¬Έν μνλ‘ νμν©λλ€.
parent[ind] = u # ν΄λΉ μ μ μ λΆλͺ¨λ₯Ό μ μ₯ν©λλ€.
return True if visited[t] else False # νκ²μ λ°©λ¬Ένλ€λ©΄ Trueλ₯Ό, λ°©λ¬Ένμ§ μμλ€λ©΄ Falseλ₯Ό λ°νν©λλ€.
# μμ€μμ νκ²μΌλ‘μ μ΅λ νλ‘μ°λ₯Ό κ³μ°ν©λλ€.
def FordFulkerson(self, source, sink):
parent = [-1]*(self.verts) # λΆλͺ¨λ₯Ό μ μ₯νλ 리μ€νΈλ₯Ό μ΄κΈ°νν©λλ€.
max_flow = 0 # μ΅λ νλ‘μ°λ₯Ό 0μΌλ‘ μ΄κΈ°νν©λλ€.
while self.BFS(source, sink, parent) : # BFSλ₯Ό μ¬μ©νμ¬ μ¦κ° κ²½λ‘λ₯Ό μ°Ύμ΅λλ€.
path_flow = float("Inf") # κ²½λ‘μ νλ‘μ°λ₯Ό 무νλλ‘ μ΄κΈ°νν©λλ€.
s = sink
while(s != source):
path_flow = min (path_flow, self.graph[parent[s]][s]) # κ²½λ‘μ μ΅μ μ©λμ μ°Ύμ΅λλ€.
s = parent[s]
max_flow += path_flow # μ΅λ νλ‘μ°μ κ²½λ‘μ μ΅μ μ©λμ λν©λλ€.
v = sink
while(v != source):
u = parent[v]
self.graph[u][v] -= path_flow # μ λ°©ν₯ κ°μ μ μ©λμ μ€μ
λλ€.
self.graph[v][u] += path_flow # μλ°©ν₯ κ°μ μ μ©λμ λ립λλ€.
v = parent[v]
return max_flow # μ΅λ νλ‘μ°λ₯Ό λ°νν©λλ€.
g.graph = [[0, 3, 2, 0, 0],
[0, 0, 1, 2, 0],
[0, 0, 0, 0, 2],
[0, 0, 0, 0, 3],
[0, 0, 0, 0, 0]]
μ΄λ° κ·Έλνλ₯Ό μμλ‘ λ€κ² μ΅λλ€.
0λ² λ Έλμμ 4λ²λ Έλκ° νκ²μΌλ μ΅λ νλ‘μ°λ₯Ό κ³μ°ν©λλ€.
ν΄λ-νμ»€μ¨ μκ³ λ¦¬μ¦μ μλ κ³Όμ λλ‘ λ°λΌκ° λ³΄κ² μ΅λλ€.
1. μ΄κΈ°μ λͺ¨λ νλ‘μ°λ 0
2. μ¦κ° κ²½λ‘λ₯Ό μ°Ύμ΅λλ€.
0-1-3-4 λλ 0-2-4 μ λλ€.
3. μ¦κ°κ²½λ‘μμ κ°μ₯ μμ μ©λμ μ°Ύμ΅λλ€.
μ΄ κ°μ΄ μ΄ κ²½λ‘λ₯Ό ν΅ν΄ νλ¬κ° μ μλ νλ‘μ°μ μμ λλ€.
μλ‘, 0-1-3-4 λΌλ©΄, μ΄ κ²½λ‘μ κ°μ μ μ©λμ κ°κ° 3,2,3 μ΄λ―λ‘ κ°μ₯ μμ κ°μΈ 2κ° μ΄ κ²½λ‘λ₯Ό ν΅ν΄ νλ¬κ° νλ‘μ°μ μμ΄ λ©λλ€.
4. μ΄ νλ‘μ°λ₯Ό μ΄ νλ‘μ°μ λνκ³ , μ΄ νλ‘μ°λ§νΌ κ° κ°μ μ μ©λμ μ€μ λλ€.
μ μμμ κ²½μ°, μ΄νλ‘μ°λ 2κ° λκ³ , κ°μ μ μ©λμ (0-1 :1), (1-3 : 0), (3-4 : 1)μ΄ λ©λλ€.
5. μ΄ κ³Όμ μ μ¦κ° κ²½λ‘κ° μμ λκΉμ§ λ°λ³΅ν©λλ€.
λ°λΌμ 0λ Έλμμ 4λ Έλ κΉμ§ νλ¬κ° μ μλ μ΅λ νλ‘μ°κ° 4μ λλ€.
νμ©
ν΄λ-νμ»€μ¨ μκ³ λ¦¬μ¦μ μ£Όλ‘ 'λ€νΈμν¬ νλ‘μ°' λ¬Έμ μ νμ©λ©λλ€.
1. κ΅ν΅, λ¬Όλ₯ λ€νΈμν¬ μ΅μ ν
2. ν΅μ λ€νΈμν¬
3. μμ ν λΉ
4. μ΄λ―Έμ§ μΈλΆν
μ΄λ―Έμ§ μ²λ¦¬μμ κ° ν½μ μ λ Έλλ‘ μκ°νκ³ μΈμ ν½μ κ°μ μ°κ²°μ κ°μ μΌλ‘ μκ°νμ¬ μ΄λ―Έμ§λ₯Ό μ¬λ¬ μμμΌλ‘ λλ λ³Ό μ μμ΅λλ€.
μ°Έκ³
https://ratsgo.github.io/data%20structure&algorithm/2017/11/29/maxflow/
μ΅λ μ λ μκ³ λ¦¬μ¦ (1) · ratsgo's blog
μ΄λ² κΈμμλ μ΅λ μ λ μκ³ λ¦¬μ¦(Max Flow Algorithm)μ ν¬λ-νμ»€μ¨ μκ³ λ¦¬μ¦(Ford-Fulkerson Algorithm)μ μ€μ¬μΌλ‘ μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€. μ΄ κΈμ κ³ λ €λ κΉμ μ± κ΅μλκ³Ό μμ κ°μ λνμ κΉν©λ¨ κ΅
ratsgo.github.io
'CS - Roadmap.sh > 3. Common Algorithms' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
3.7.1 Pre-Order Traversal(μ μ μν) (0) | 2024.02.08 |
---|---|
3.6.4 Primβs Algorithm (νλ¦Ό μκ³ λ¦¬μ¦) (0) | 2024.02.07 |
3.6.2 Kruskalβs algorithm (ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦) (1) | 2024.02.05 |
3.6 Greedy Algorithms - 3.6.1 Huffman Coding (0) | 2024.02.03 |
3.6 Greedy Algorithms (0) | 2024.02.02 |