1. 개념
그래프의 간선에 거리, 시간이나 가중치, 즉 cost 대신에 용량(capacity)이라는 개념이 추가된다.
이제 두 정점 u, v를 잇는 간선 (u, v)가 있을 때, 정점 u에서 v 방향으로 간선의 용량 이하만큼의 유량(flow)을 흘려보낼 수 있다.
또한, 그래프에 서로 다른 두 정점인 소스(source), 싱크(sink) 정점이 정해지고 소스 정점에서 유량을 발생시켜서 간선들을
통해 싱크 정점에 도달시키는 것이 목표이다. 유량을 발생시킬 수 있는 것은 소스 정점 뿐이고, 그 외의 정점들은 자신이 받은 유량만큼만
다시 흘려보낼 수가 있다.
2. 특징
- 각 간선에 흐르는 유량은 그 간선의 용량을 넘어서는 안 된다.
- 소스와 싱크를 제외한 정점에서는 들어오는 유량 총합과 나가는 유량 총합이 같아야한다.
- 간선(u,v) 방향으로 유량이 흐르고 있다면, 역방향으로는 음의 유량이 그만큼 흐르고 있는 것으로 취급한다.
3. 구현
[1] 포드 풀커슨 알고리즘(Ford-Fulkerson algorithm)
1) S에서 T로 가는 증가 경로(augmenting path)를 아무거나 하나 찾는다. 이때, 증가 경로는 단순 경로이고 경로상의 모든 간선에
아직 여유 용량(residual)이 남아 있다. 즉, c(u, v) - f(u, v) > 0
2) 증가 경로 중 차단 간선(blocking edge)을 찾는다. 이 간선은 경로상에서 c(u, v) - f(u, v) 값이 최소인 간선이다.
많아봐야 이만큼만 유량을 더 보낼 수 있을 것이다. 이 값을 F라 하자.
3) 경로상의 모든 간선에 F만큼의 유량을 추가한다. 즉, S에서 T로 이 경로를 따라서 F만큼의 유량을 새로 흘려보낸 것이다.
경로상의 모든 간선에 대해 f(u, v) += F. 그런데 이 성질을 만족시키기 위해 f(v, u) -= F 또한 행해야 한다.
역방향으로 상응하는 음의 유량을 흘려주는 것.
이 과정들을 더 이상 증가 경로가 없을 때까지 반복한다. 증가 경로를 찾고, 찾은 경로에 대해 가능한 많은 유량을 흘려보내는 것의 반복이다.
출처 : 네이버 '라이'님 블로그
'Programming > Algorithm' 카테고리의 다른 글
CCW(CounterClockWise) 알고리즘 (0) | 2018.08.24 |
---|---|
배낭 알고리즘(Knapsack Algorithm) (0) | 2018.08.23 |
최소 공통 조상(Lowest Common Ancestor / LCA) (0) | 2018.08.22 |
에라토스테네스의 체(get Prime Number) (0) | 2018.08.22 |
벨만 포드 알고리즘 (Bellman-Ford-Moore Algorithm) (0) | 2018.08.22 |