Edmonds-karp Algorithm

개념

네트워크의 최대 유량을 구하는 알고리즘이다.

3가지 Network의 개념이 필요하다.

수행 과정

Edmonds-karp 알고리즘은 아래와 같이 진행된다.

  1. Network의 구조를 입력받아 Capacity Network에 저장한다. 경로는 벡터등으로 Adjacency List 를 구현하여 따로 저장한다.
  2. 아래의 과정을 더 흐를 수 있는 경로(Residual이 양수)가 존재하지 않을 때까지 반복한다.
    1. BFS를 통해 Source에서 Sink로 가는 경로를 구한다. 이때 Parent를 기록하면서 경로를 기억한다.
    2. 만약 Sink에 도달했다면 BFS를 종료한다.
    3. parent를 통해 저장했던 경로를 따라가면서 해당 경로에서 흐를 수 있는 최대 유량(경로중 Residual이 가장 작았던 유량)를 구한다.
    4. 이것이 흐르도록 처리한다. 해당 경로를 따라가면서 Flow Network에 구했던 최대유량을 더해준다. 여기서 경로의 반대 방향으로는 구해놨던 최대유량을 빼주어야 한다. 이미 흐른만큼 반대로 흐를수 있게 되었기 때문이다.
    5. 구해놨던 최대유량을 전체 Network의 최대유량에 더한다.

Resdidual Network를 따로 구현해도 되고 매순간 필요할때 Capacity - Flow로 사용해도 된다.

주의 사항

예시

백준 6086번 : 최대유량

6086번: 최대 유량