Skip to content

Commit

Permalink
Update 2024-09-12-ssca1.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Annyeong-One authored Sep 12, 2024
1 parent 2507bdd commit 9d7d874
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions _posts/2024-09-12-ssca1.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ $G$가 주어질 때, $\|f\|$가 최대가 되는 flow $f$를 찾는 문제를
마찬가지로 유향 그래프 $G=(V, E)$에 대해서 용량, 소스, 싱크를 정의해 두면,
- $C \subset V$, $C \neq V$, $s \in C$, $t \notin C$ (즉 전체집합이 아닌 정점 부분집합이 $s$는 포함하지만 $v$는 포함하지 않는 경우)
인 정점 부분집합 $C$를 $s-t$ cut이라 합니다. 이때
$\|C\| = \sum_{e \in \delta^+(C)} c(e)$
- $\|C\| = \sum_{e \in \delta^+(C)} c(e)$
를 cut value라 합니다. (즉 소스 포함 부분집합에서 싱크 포함 여집합으로 들어가는 유량의 총합입니다.)

### Definition: Min-Cut Prob.
Expand All @@ -63,6 +63,7 @@ $G$가 주어질 때, $\|C\|$가 최소가 되는 cut $C$를 찾는 문제를
용량이 $c$인 그래프 $G$의 어떤 유량 $f$에 대해 새로운 그래프 $G(f) = (V, F)$를 정의합시다. 이때 $F$는, $\forall e=(u,v) \in E$,
- $c(e)-f(e)>0$이면, 용량이 $c(e)-f(e)$인 유향간선 $(u,v)$를 포함합니다.
- $f(e)>0$이면, 용량이 $f(e)$인 유향간선 $(v,u)$를 포함합니다.

$G(f)$의 용량함수는 $u$라 둡시다.

직관적으로 말하기 뭔가 이상하긴 한데, 만약 $G(f)$에 어떤 간선이 있다면 그 간선에 그만큼의 '용량이 더 남아있다'는 느낌으로 해석할 수 있습니다. 아래에서 조금 더 얘기합시다.
Expand All @@ -85,7 +86,7 @@ $G(f)$의 용량함수는 $u$라 둡시다.

## Theorem: Ford-Fulkerson 1965.
Algorithm 1이 종료하면 이때의 $f$가 Max flow이다.
\

참이라면, augm path를 찾아서 계속 augment해주기만 하면 최대 유량을 찾을 수 있다는 거겠죠? 그럼 증명해봅시다.

Proof. 그럼 Augm (s,t) Path가 없는 상태에 도달하면 최대 유량임을 보이면 됩니다.
Expand All @@ -94,6 +95,7 @@ $G(f)$에서 $s$에서 출발해 도달할 수 있는 정점 집합 $X$를 잡
- $e \in \delta^+(X)$에 대해 $f(e) < c(e)$인 것이 없고
- $e \in \delta^-(X)$에 대해 $f(e) > 0$인 것이 없습니다.
- 있다면 도달 가능한 정점 집합이 보다 크니까요.

그러면 $\|f\| = \sum_{e \in \delta^+(X)} c(e) - \sum_{e \in \delta^-(X)} 0 = \|X\|$입니다. 즉 $\|f\|=\|X\|$입니다. 앞에서 증명한 최대 유량-최소 컷의 weak duality에 의해 이런 $f$가 최대 유량이고 동시에 $X$가 최소 컷입니다.

엄청 대단한 게 맞긴 한데, 솔직히 그렇게 빠르게 작동하는 효율적 알고리즘은 아니긴 합니다. 말 그대로 augm path를 '아무거나' 뽑아도 알고리즘이 작동하기 때문에, 비효율적인 방법으로 뽑으면 정말 오래 걸릴 수도 있습니다. 시간복잡도를 계산하자면, 모든 용량이 정수인 경우 $O(nm\max(c))$가 되고, 실수인 경우 최악의 경우에서 시복이 bound되지 않습니다.
Expand All @@ -106,6 +108,7 @@ $G(f)$에서 $s$에서 출발해 도달할 수 있는 정점 집합 $X$를 잡
그래프 $G=(V, E)$, 용량 $c: E \rightarrow \mathbb{R}\_{>0}$, 소스와 싱크 $s, t \in V$에 대해서 $f: E \rightarrow \mathbb{R}_{\ge 0}$가
- $0 \le f(e) \le c(e) \;\; \forall e \in E$이고 (플로우의 조건이죠?)
- $e(v) = \sum_{e \in \delta^-(V)} f(e) - \sum_{e \in \delta^+(V)} f(e) \ge 0 \;\; \forall v \in V/\{s,t\}$이면 (그러니까 $e(v)$는 $v$에서 나가야 하는 추가 유량(excess)입니다.)

그러한 $f$를 preflow라 합니다. 이런 $f$에 대해서도 residual network를 똑같이 정의할 수 있다는 점을 기억해 둡시다. 이제 label을 정의합시다.

$d: V \rightarrow \mathbb{Z}_{\ge 0}$이
Expand All @@ -121,6 +124,7 @@ while $\exists u$ an active node:
- Push: if $\forall (u, v)$ legitimate in $G(f)$, then
- push flow on (u, v) with the amount $\min(U(u, v), e(u))$ (residual에서 active node가 있을때 legitimate한 간선이 있으면, 그 간선을 최대한 push합니다.)
- Relabel: else, $d(u) = (\min_{(u, v) \in G(f)} {d(v)}) + 1$ (그런 거 없으면, $d$의 label을 바꿉니다.)

이때 다음 두 가지는 쉽게 볼 수 있습니다.
**Proposition:**
1. 알고리즘의 while을 돌릴 때 preflow와 label의 조건이 그대로 만족
Expand Down Expand Up @@ -161,6 +165,7 @@ $u$가 active해야 $d(u)$가 늘어날 수 있기 때문에, $d(u)$가 늘어
'포텐셜'이라는 이름으로 $\Phi(f, d) := \sum_{u \text{ is active}} d(u)$를 정의합시다. 최초 및 최종 값은 0이겠죠?
- 포텐셜이 늘어난다는 것은 relabel 혹은 포화 push 연산이 가해진다는 뜻이고요,
- 줄어든다는 것은 불포화 push 연산이 가해진다는 겁니다.

여기서 relabel 연산은 포텐셜을 1 늘리며, 그 횟수는 $O(n^2)$입니다. 포화 push는 포텐셜을 최대 $O(n(2n-1)m)$ 늘립니다. 즉 포텐셜이 $O(n^2m)$만큼 늘어나는 것이고, 불포화 push는 포텐셜을 1 이상 줄이므로 당연히 줄어드는 횟수도 $O(n^2m)$번 입니다. 따라서 불포화 push 연산 횟수는 $O(n^2m)$입니다.

**Lemma.** 알고리즘이 종료하면 그게 최대 유량이다.
Expand Down

0 comments on commit 9d7d874

Please sign in to comment.