SlideShare a Scribd company logo
1 of 25
By POSTECH Computer Algorithm Team
네트워크 유량 - 1
임병찬
Network Flow
Contents
POSTECH Computer Algorithm Team
Maximum Flow 2
Flow Graph 1
Ford-Fulkerson Algorithm 3
Edmonds-Karp Algorithm 4
Dinic Algorithm 5
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
POSTECH Computer Algorithm Team
Concept
- 수도관을 생각해 봅시다.
- 수도원에서 물이 나온다 -> 수도관을 통해 물이 흘러간다 -> 세면대에서 물이 나온다
- 무한히 물을 뿜어내는 Node(Source)와 무한히 물을 받아내는 Node(Sink)와 물이 지나가는 Node가 있다고 가정
- 그러면, Flow Graph가 만들어진다.
Flow Graph
POSTECH Computer Algorithm Team
Concept
- 수도관에 물이 아주 많이 흘러가면 어떻게 될까?
- 당연히 수도관이 터진다…
- 특정 노드를 지정했을 때, 그 부분으로 들어가는 물의 양 = 나오는 양의 물의 양
- 아니라면? 어디선가 물이 나오거나 빠져나오고 있다는 소리…
Flow Graph
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
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
POSTECH Computer Algorithm Team
Concept
Flow Graph
POSTECH Computer Algorithm Team
Concept
Flow Graph에서는 다음과 같은 문제들을 다룬다.
- Maximum Flow
- Minimum Cut
- Bipartite Matching
- MCMF
- Gomory-Hu Tree
Flow Graph
POSTECH Computer Algorithm Team
Concept
- Flow Graph에서 최대한 물을 많이 흘리고 싶다.
- 전체 Flow = Sink로 들어가는 flow의 총량의 합
- Flow Graph의 조건을 위배하지 않으면서 Flow를 흘려주고 싶다.
- 어떻게?
Maximum Flow
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
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
POSTECH Computer Algorithm Team
Concept
- 그렇다면, 이 아이디어를 적용한 Greedy Algorithm은 Maximum Flow를 잘 찾을까?
- 놀랍게도, 잘 찾는다!!
- 증명은 다음에.
Maximum Flow
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
POSTECH Computer Algorithm Team
Concept
- f가 몇인지 구체적으로 알 수 있다면, 제한시간안에 잘 풀 수 있다.
- 하지만, f가 몇인지 모른다면 이 문제는 다항시간안에 풀리는 것을 보장할 수 없다.
모든 Flow Algorithm의 증명을 Ford-Fulkerson으로 하기 때문에 꼭 알아둘 것.
Ford-Fulkerson Algorithm
Code Explanation
POSTECH Computer Algorithm Team
Code
Code Explanation
Ford-Fulkerson Algorithm
POSTECH Computer Algorithm Team
Concept
- 그래프를 탐색하는 또 한가지의 방법 – BFS
- 그래서 Ford-Fulkerson을 DFS가 아닌, BFS를 이용하여 구할 수 있다.
- 방법은 Ford-Fulkerson 방법과 비슷하다.
- BFS로 Algorithm을 돌리는 방법을 Edmonds-Karp Algorithm이라고 한다.
Edmonds-Karp Algorithm
Code Explanation
POSTECH Computer Algorithm Team
Code
Code Explanation
Edmonds-Karp Algorithm
POSTECH Computer Algorithm Team
Concept
- Edmonds-Karp는 Ford-Fulkerson에 비하여 코딩이 어렵다.
- 하지만, O(fE)의 시간이 걸리는 Ford-Fulkerson에 비하여 Edmonds-Karp는 O(VE^2)으로 동작한다.
- 다항시간으로 동작하는 Algorithm이기에, 중요하다.
Edmonds-Karp Algorithm
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
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
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
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
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
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/

More Related Content

Similar to 04. network flow 1 (7)

05. network flow 2
05. network flow 205. network flow 2
05. network flow 2
 
Network flow
Network flowNetwork flow
Network flow
 
Network flow
Network flowNetwork flow
Network flow
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
 
Shortest path
Shortest pathShortest path
Shortest path
 
Tree algorithm
Tree algorithmTree algorithm
Tree algorithm
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity
 

More from 승혁 조

More from 승혁 조 (20)

RSS Live Slider
RSS Live SliderRSS Live Slider
RSS Live Slider
 
Parallel binary search
Parallel binary searchParallel binary search
Parallel binary search
 
Geometry Algorithms
Geometry AlgorithmsGeometry Algorithms
Geometry Algorithms
 
FFT
FFTFFT
FFT
 
Heavy light decomposition
Heavy light decompositionHeavy light decomposition
Heavy light decomposition
 
Advanced segment tree
Advanced segment treeAdvanced segment tree
Advanced segment tree
 
L-R network flow
L-R network flowL-R network flow
L-R network flow
 
Sqrt(n) algorithm
Sqrt(n) algorithmSqrt(n) algorithm
Sqrt(n) algorithm
 
NIM game
NIM gameNIM game
NIM game
 
DP 중급 2
DP 중급 2DP 중급 2
DP 중급 2
 
분할정복
분할정복분할정복
분할정복
 
String algorithm
String algorithmString algorithm
String algorithm
 
2019 ppc answers
2019 ppc answers2019 ppc answers
2019 ppc answers
 
Number theory
Number theoryNumber theory
Number theory
 
06. sorting
06. sorting06. sorting
06. sorting
 
05 divide and conquer
05 divide and conquer05 divide and conquer
05 divide and conquer
 
04. binary search
04. binary search04. binary search
04. binary search
 
03. segment tree
03. segment tree03. segment tree
03. segment tree
 
02. binary search tree
02. binary search tree02. binary search tree
02. binary search tree
 
03. dp easy
03. dp easy03. dp easy
03. dp easy
 

04. network flow 1

  • 1. By POSTECH Computer Algorithm Team 네트워크 유량 - 1 임병찬 Network Flow
  • 2. Contents POSTECH Computer Algorithm Team Maximum Flow 2 Flow Graph 1 Ford-Fulkerson Algorithm 3 Edmonds-Karp Algorithm 4 Dinic Algorithm 5
  • 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
  • 8. POSTECH Computer Algorithm Team Concept 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
  • 16. Code Explanation POSTECH Computer Algorithm Team Code Code Explanation Ford-Fulkerson Algorithm
  • 17. POSTECH Computer Algorithm Team Concept - 그래프를 탐색하는 또 한가지의 방법 – BFS - 그래서 Ford-Fulkerson을 DFS가 아닌, BFS를 이용하여 구할 수 있다. - 방법은 Ford-Fulkerson 방법과 비슷하다. - BFS로 Algorithm을 돌리는 방법을 Edmonds-Karp Algorithm이라고 한다. Edmonds-Karp Algorithm
  • 18. Code Explanation POSTECH Computer Algorithm Team Code Code Explanation 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/