[파이썬] 플로우 네트워크의 최대 유량 (Max Flow) 알고리즘

플로우 네트워크는 그래프에서 한 노드에서 다른 노드로 유량을 흘려보내는 네트워크 모델입니다. 최대 유량 (Max Flow) 문제는 한 출발지에서 목적지까지 흐를 수 있는 최대 유량을 찾는 문제입니다. 이러한 문제를 해결하기 위해 많은 알고리즘이 개발되었는데, 이 중에 가장 유명한 알고리즘은 Ford-Fulkerson 알고리즘입니다.

Ford-Fulkerson 알고리즘은 잔여 그래프(Residual Graph) 내에서 증가 경로를 찾아 유량을 흐르게 하며, 최대 유량을 찾는 과정을 반복적으로 수행합니다. 잔여 그래프는 원래 그래프에 유량을 뺀 나머지 용량을 가지는 그래프입니다. 이를 통해 추가로 유량을 보낼 수 있는 경로를 찾아내고, 이를 통해 유량을 증가시킵니다.

Ford-Fulkerson 알고리즘 구현하기

다음은 Ford-Fulkerson 알고리즘을 파이썬으로 구현한 예시 코드입니다.

def bfs(graph, start, end, parent):
    visited = [False] * len(graph)
    queue = []
    queue.append(start)
    visited[start] = True
    
    while queue:
        node = queue.pop(0)
        for index, value in enumerate(graph[node]):
            if not visited[index] and value > 0:
                queue.append(index)
                visited[index] = True
                parent[index] = node
                
                if index == end:
                    return True
    
    return False

def max_flow(graph, start, end):
    parent = [-1] * len(graph)
    max_flow = 0
    
    while bfs(graph, start, end, parent):
        path_flow = float('inf')
        s = end
        
        while s != start:
            path_flow = min(path_flow, graph[parent[s]][s])
            s = parent[s]
        
        max_flow += path_flow
        v = end
        
        while v != start:
            u = parent[v]
            graph[u][v] -= path_flow
            graph[v][u] += path_flow
            v = parent[v]
    
    return max_flow

위 코드에서 graph는 플로우 네트워크의 인접행렬, start는 출발지 노드, end는 목적지 노드입니다. max_flow 함수는 시작점에서 종점으로 가는 최대 유량을 반환합니다. Ford-Fulkerson 알고리즘의 핵심인 bfs 함수는 너비 우선 탐색을 통해 증가 경로를 찾는 역할을 합니다.

Conclusion

플로우 네트워크의 최대 유량 문제는 많은 실생활 예시에서 사용되며, 효율적인 알고리즘을 통해 빠르게 해결할 수 있습니다. Ford-Fulkerson 알고리즘은 이러한 문제를 효율적으로 해결하기 위해 많이 사용되는 알고리즘 중 하나입니다. 이를 통해 운송 문제, 네트워크 최적화 등 다양한 문제를 해결할 수 있습니다.