HJW's IT Blog

Algorithm: Network Flow 본문

알고리즘

Algorithm: Network Flow

kiki1875 2023. 5. 22. 17:48

#개요

          > Network Flow란 노드들과 그들 사이의 에지로 이루어진 흐름을 나타내는 개념

          > 노드들이 출발지와 목적지로 구성되며, 에지들은 용량(capacity)를 가진다

          > 목표: 출발지에서 목적지로 가는 흐름의 양을 최대화/최소화 하는것

 

          > Flow Network란?

                    >> 네트워크 플로우 문제를 모델링하기위한 그래프이다.

                    >> 각 에지에 허용가능한 최대 흐름이 지정되어 있다

                    >> 시작점과 목적지가 지정되어 있어야 한다

                    >> 출발지에서 목적지로 흐르는 실제 흐름량이 나와있다

 

#입력

          > 가중그래프 

          > 에지의 가중치: c(e)

          > 시작점 s: 들어오는 에지 x

          > 도착점 t: 나가는 에지 x

 

#Flow 란?

          > 그래프 G,s,t 가 주어졌을 때, flow f는 각 에지 e에 정수값 f(e)를 다음 조건에 맞추어 할당하는 문제

                    >> 모든 에지 e에 대해 0<= f(e) <= c(e)

                    >> flow f의 값 |f|는 s 에서 나가는 flow 의 총량

                    >> 즉 한 노드에 들어오는 값이 한 노드에서 나가는 양보다 크면 안된다.

          > Maximum Flow: 최대 값을 가지는 flow

 

#Cut 이란?

          > 주어진 노드 V를 두 집합 Vs 와 Vt로 분할

                    >> s는 Vs에, t는 Vt에 들어있다

                    >> Cut X에 대해 f(X)는 X를 지나가는 flow 의 값 총량

                    >> Cut X에 대해 c(X)는 Vs에서 X를 지나 Vt로 가는 에지의 총량

                    >> Cut X 가 주어지면 s에서 t로 가는 flow 의 값은 c(X) 보다 클 수 없다

                              >>> 그렇다면 maximum flow 는 c(X)의 최소값과 같다.

 

#Ford-Fulkerson 알고리즘

          > s 에서 t로 가는 경로를 찾는다(BFS)

                    >> 이때 경로에 포함되는 에지 e는 c(e)>0 이어야 한다. 

          > 위에서 구한 경로를 p 라고 할때, p에 속하는 각 에지 e 마다 c(e)의 최소값을 구해 m 이라 하자

          > p의 각 에지 e 마다 c(e) -= m 으로 갱신

                    >> 이때 e = (u,v)일때, e' = (v,u)에 대해 c(e') = c(e') + m 이다

          > 더이상 할 수 없을떄 까지 반복

 

#Example

다음과 같은 그래프가 있다 가정

 

경로를 BFS로 탐색후 각 경로마다 최소 에지 값을 구해 경로의 모든 에지에 더해준다

          > S - A - D - T 의 경로의 경우 A - D 가 최소 에지 값(8)을 갖는다. 즉

                    >> S - A = 8/10

                    >> A - D = 8/8

                    >> D - T = 8/10

          > S - C - D - T 의 경우 위에서 구한 D - T 경로의 에지가 8 이고 최대 용량은 10 이기에 이 경로에서 최소 에지는 2.

                    >> S - C = 2/10

                    >> C - D = 2/9

                    >> D - T = 10/10

          > S - C - D - A - B - T의 경로를 보면 D - A 는 역방향이다.

                    >> 역방향의 경우 최소값(4)을 더하는 것이 아닌 빼주면 된다. 즉 경로의 값은 다음과 같다

                    >> S - C = 6/10

                    >> C - D = 6/9

                    >> D - A = 4/8 (이전에 A-D = 8 이었다)

                    >> A - B = 4/4

                    >> B - T = 4/10

          > S - A - D - B - T 최소값(2)

                    >> S - A = 10/10

                    >> A - D = 6/8

                    >> D - B = 2/6

                    >> B - T = 6/10

          >S - C - D - B - T 최소값 (3)

                    >> S - C = 9/10

                    >> C - D = 9/9

                    >> D - B = 5/6

                    >> B - T = 9/10

          

 

#Dinitz 알고리즘

          > BFS를 이용해 s 에서 t로 가는 가장 짧은 길이의 모든 경로를 찾는다.

                    >> 이때, 경로에 포함되는 에지 e는 c(e)>0 이어야 한다. 

          > 위에서 찾은 각 경로 p 마다, p에 속하는 각 에지 e 마다, c(e)의 최소값을 구해 이를 m 이라 하자

          > p 의 각 에지 e 마다 c(e) -= m으로 갱신, e = (u,v) 일때 e' = (v,u) 이면, c(e') = c(e') + m

'알고리즘' 카테고리의 다른 글

Algorithm: 문제풀이 1  (1) 2023.06.05
Algorithm: Convex Hull  (0) 2023.05.23
Algorithm: Kruskal Algorithm & Binary Search  (0) 2023.04.17
Algorithm: Binary Search  (0) 2023.04.15
Algorithm: Segment Tree  (0) 2023.04.14