| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 일급 컬렉션
- Google OAuth
- lombok
- 일급 객체
- factory
- Spring
- java
- OAuth 2.0
- synchronized
- spring security
- Volatile
- builder
- Dependency Injection
- Today
- Total
HJW's IT Blog
Algorithm: Network Flow 본문
#개요
> 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 |