3. POSTECH Computer Algorithm Team
Concept
- 우리들이 지금까지 해온 Graph는 각 Edge에 Weight가 주어져 있는 Weight Graph
- Min( sum( Path의 모든 Weight ) ) = distance
- Weight Graph에서 중요한 알고리즘 : Minimum Distance, Minimum Spanning Tree, Tree DP….
- Sum( min( Path의 모든 Weight ) ) 는 뭐가 될까? -> Flow Graph
Flow Graph
4. POSTECH Computer Algorithm Team
Concept
- 수도관을 생각해 봅시다.
- 수도원에서 물이 나온다 -> 수도관을 통해 물이 흘러간다 -> 세면대에서 물이 나온다
- 무한히 물을 뿜어내는 Node(Source)와 무한히 물을 받아내는 Node(Sink)와 물이 지나가는 Node가 있다고 가정
- 그러면, Flow Graph가 만들어진다.
Flow Graph
5. POSTECH Computer Algorithm Team
Concept
- 수도관에 물이 아주 많이 흘러가면 어떻게 될까?
- 당연히 수도관이 터진다…
- 특정 노드를 지정했을 때, 그 부분으로 들어가는 물의 양 = 나오는 양의 물의 양
- 아니라면? 어디선가 물이 나오거나 빠져나오고 있다는 소리…
Flow Graph
6. POSTECH Computer Algorithm Team
Concept
- Directed Graph G = (V,E)가 주어진다.
- V에는 source S, sink T가 주어진다.
- 모든 Edge는 (u, v, c)형식으로 되어있다.
- (u, v, c) = u에서 v로 가는 Directed Edge고, 그 Edge에 흐르는 물의 양 f는 c를 넘을 수 없다.
- 이 c를 Edge의 Capacity, f를 Edge의 Flow라고 부른다.
Flow Graph
7. POSTECH Computer Algorithm Team
Concept
Flow Graph의 조건은 다음과 같다.
- 임의의 u, c에 대해, (u, S, c)는 E에 존재하지 않는다.
- 즉, source를 화살표 끝으로 하는 edge는 존재하지 않는다(Source는 무한히 물을 제공하는 곳이라 물을 받을 필
요가 없기 때문).
- 임의의 u, c에 대해, (T, u, c)는 E에 존재하지 않는다.
- 즉, sink를 화살표 시작으로 하는 edge는 존재하지 않는다(Sink는 물을 무한히 빨아들이는 곳이기 때문).
- Flow는 Capacity를 넘으면 안된다.(By Definition)
- Capacity, flow >= 0
- Sum( 한 node로 들어오는 flow ) = Sum( 나오는 flow )
Flow Graph
9. POSTECH Computer Algorithm Team
Concept
Flow Graph에서는 다음과 같은 문제들을 다룬다.
- Maximum Flow
- Minimum Cut
- Bipartite Matching
- MCMF
- Gomory-Hu Tree
Flow Graph
10. POSTECH Computer Algorithm Team
Concept
- Flow Graph에서 최대한 물을 많이 흘리고 싶다.
- 전체 Flow = Sink로 들어가는 flow의 총량의 합
- Flow Graph의 조건을 위배하지 않으면서 Flow를 흘려주고 싶다.
- 어떻게?
Maximum Flow
11. POSTECH Computer Algorithm Team
Concept
- Greedy Algorithm을 사용해 보자!
- 방법 : flow를 흘려줄 수 있는 edge에 모두 flow를 흘려 주자.
- (S, u0)에 flow 1 추가, 그러면 u0에서 나오는 flow가 1개 부족하니 (u0, u1)에 flow 1 추가, 그러면 u1에서 나
오는 flow가 1개 부족하니 (u1, u2)에 flow 1 추가….
- 더 이상 flow를 못 흘려줄 때까지 해보자. Maximum Flow 일까?
- 당연히 아니다…
왜 Maximum Flow가 아닐까?
Maximum Flow
12. POSTECH Computer Algorithm Team
Concept
- 왜냐하면 더 흘려줄 수 있으니까!
- f1 > f2이라고 가정하자. u에서 v로 f1의 flow가 흐르고 있고, v에서 u로 f2의 flow가 흐르고 있다고 가정하자.
- 그러면, 그냥 u에서 v로 f1-f2의 flow가 흐르고 있다고 가정하여도 된다.
- 반대로, u에서 v로 f1의 flow가 흐르고 있을 때, 그 flow를 f2로 줄임으로써, v에서 u로 f1-f2의 flow가 흐르고
것과 같이 만들 수 있다.
- 즉, u에서 v로 flow를 흘린다 = u에서 v로 가는 edge의 flow를 1 늘리거나 v에서 u로 가는 flow를 1 줄이면 된다.
Maximum Flow
13. POSTECH Computer Algorithm Team
Concept
- 그렇다면, 이 아이디어를 적용한 Greedy Algorithm은 Maximum Flow를 잘 찾을까?
- 놀랍게도, 잘 찾는다!!
- 증명은 다음에.
Maximum Flow
14. POSTECH Computer Algorithm Team
Concept
- (s, u0)에 flow 1, (u0, u1)에 flow 1, …을 주자!
- 가장 주기 쉽게 탐색하는 방법 = DFS
- Path (s, u0, u1, … , uk, T)를 찾자.
- 그 뒤, min( c(s, u0), c(u0, u1), … , c(uk, T) ) = d를 구하자.
- 그러면, 각 edge마다 flow d를 더할 수 있다.
- 각 edge마다 flow d를 더한 뒤, 다시 DFS를 돌려주자.
- 하나의 Path를 찾는데 O(E)의 시간이 필요하다.
- d >= 1이므로, 한번의 flow 덧셈마다 전체 flow가 1이 늘어난다.
- Maximum flow가 f라면, O(fE)안에 프로그램이 돌아간다.
Ford-Fulkerson Algorithm
15. POSTECH Computer Algorithm Team
Concept
- f가 몇인지 구체적으로 알 수 있다면, 제한시간안에 잘 풀 수 있다.
- 하지만, f가 몇인지 모른다면 이 문제는 다항시간안에 풀리는 것을 보장할 수 없다.
모든 Flow Algorithm의 증명을 Ford-Fulkerson으로 하기 때문에 꼭 알아둘 것.
Ford-Fulkerson Algorithm
17. POSTECH Computer Algorithm Team
Concept
- 그래프를 탐색하는 또 한가지의 방법 – BFS
- 그래서 Ford-Fulkerson을 DFS가 아닌, BFS를 이용하여 구할 수 있다.
- 방법은 Ford-Fulkerson 방법과 비슷하다.
- BFS로 Algorithm을 돌리는 방법을 Edmonds-Karp Algorithm이라고 한다.
Edmonds-Karp Algorithm
19. POSTECH Computer Algorithm Team
Concept
- Edmonds-Karp는 Ford-Fulkerson에 비하여 코딩이 어렵다.
- 하지만, O(fE)의 시간이 걸리는 Ford-Fulkerson에 비하여 Edmonds-Karp는 O(VE^2)으로 동작한다.
- 다항시간으로 동작하는 Algorithm이기에, 중요하다.
Edmonds-Karp Algorithm
20. POSTECH Computer Algorithm Team
Concept
- 만약 u에서 v로 flow를 1이라도 흘려줄 수 있을 때, u와 v의 거리를 1이라고 정의하자.
- source에서 sink로 가는 최단거리가 d라고 가정하자.
- 그러면, (S, u0, u1, … , ud-1, T)라는 path가 존재한다.
- flow를 흘려주는 방식에 의해, c(ui, ui+1) = f(ui, ui+1) 혹은 f(ui+1, ui) = 0이 되는 Edge가 생긴다.
- 이 Edge들은, 최단 거리가 d로 고정될 때 절대 바뀌지 않는다.
- 즉, 각 d마다 O(E)번의 갱신이 일어나고 d는 O(V)다.
- 즉, 총 O(VE)번의 갱신, 최단거리 찾는데 O(E)므로 O(VE^2)
Edmonds-Karp Algorithm
21. POSTECH Computer Algorithm Team
Concept
- DFS를 이용하여 Maximum Flow를 찾으면 Ford-Fulkerson. O(fE)
- BFS를 이용하여 Maximum Flow를 찾으면 Edmonds-Karp. O(VE^2)
- 더 빠르게 할 수 있는 방법은 없을까?
- 방법은 있다!
- DFS와 BFS의 끔찍한 혼종(?)을 이용하여 Maximum Flow를 찾으면 Dinic Algorithm. O(V^2E)
Dinic Algorithm
22. POSTECH Computer Algorithm Team
Concept
- 만약 u에서 v로 flow를 1이라도 흘려줄 수 있을때, u와 v의 거리를 1이라고 가정한다.
- BFS를 돌려서, 모든 node의 rank를 설정한다. rank = source에서 그 node까지 가는데 minimum distance
- 그렇게 만들어진 Graph를 Level Graph라고 한다. 이제, 이 Level Graph에서 DFS를 사용하여 Maximum Flow를 계산
한다.
- 더 이상 DFS로 Maximum Flow를 찾을 수 없으면, 다시 BFS를 돌려서 Level Graph를 갱신한다.
- 더 이상 Level Graph를 갱신할 수 없으면, 알고리즘 종료.
Dinic Algorithm
23. POSTECH Computer Algorithm Team
Concept
- Edmonds-Karp의 가장 큰 문제점은, 더 이상 사용하지 못하는 Edge를 사전에 파악할 방법이 없다.
- 직접 그 Edge를 찾고, Flow가 흐를 수 없는 것을 확인하여야 한다.
- 임의의 수열 s0, s1, … , si번째 Edge에 Flow가 흐를 수 없다면, 일일이 확인을 해줘야 한다(Edmonds-Karp)
- 1, 2, … , i번째 Edge에 Flow가 흐를 수 없다는 것이 확인된다면, 다음 탐색에서는 i+1번째 Edge부터 탐색하면
된다.(Dinic)
Dinic Algorithm
24. POSTECH Computer Algorithm Team
Concept
- Level Graph를 만들면, Level Graph에서의 모든 Path는 BFS Path가 된다!
- 그렇다면 Edmonds-Karp에서의 증명과 마찬가지로, 한번 path를 찾을 때 마다 Edge 1개씩 줄어든다.
- 그리고, 모든 path의 길이는 정확히 d다.
- 최단 길이를 d로 고정할 때 시간은 O(dE). d는 계속 늘어나며, V 이하므로, O(V^2E)로 동작한다.
Dinic Algorithm
25. POSTECH Computer Algorithm Team
More
- 기초 https://www.acmicpc.net/problem/6086
- 숙련 http://www.spoj.com/problems/FASTFLOW/
- 참고 https://www.geeksforgeeks.org/dinics-algorithm-maximum-flow/