[그래프 알고리즘] 08. Maximum Flow Problem (Part 2)

jmt·2024년 6월 10일

알고리즘

목록 보기
16/18

Introduction

Ford-Fulkerson Method(포드-풀커슨 방법)은 3가지 중요 아이디어에 의존한다. 앞에서 배운 잔여 네트워크(residual network) / 증강 경로(augmenting path) / cut이다. 이 3가지 개념은 Max-flow Min-cut 정리에 활용된다.

포드-풀커슨 방법은 flow 값을 반복적으로 증가시킨다. 모든 u,vVu, v \in V에 대해 f(u,v)=0f(u,v) = 0으로 초기화시킨 뒤, 매 단계마다 잔여 네트워크의 증강 경로를 찾는다. 증강 경로를 찾았다면, 해당 경로 pp를 따라 augmentation 연산을 수행하여 flow를 증가시킨다. 만약 잔여 네트워크의 증강 경로가 더 이상 존재하지 않는다면 ff를 return한다. 이 방법은 우리가 part 1에서 했던 방법과 크게 다르지 않다. 더 이상 증강 경로가 존재하지 않는 것이 maximum flow를 찾았다는 의미가 되는 것은 max-flow min-cut 정리로 증명이 가능하다.

Cut

cut에 대한 개념을 더 자세히 배워보자. flow network의 cut(S,T)\text{cut}(S, T)VVsS,tTs \in S, t \in T가 되게 하는 분할이다. flow ff에 대해 cut(S,T)\text{cut}(S, T)net flow는 다음과 같다.

f(S,T)=uSvTf(u,v)uSvTf(v,u)f(S, T) = \sum_{u \in S} \sum_{v \in T} f(u,v) -\sum_{u \in S} \sum_{v \in T} f(v,u)

그리고 cut(S,T)\text{cut}(S, T)용량(capacity)는 다음과 같다.

c(S,T)=uSvTc(u,v)c(S, T) = \sum_{u \in S}\sum_{v \in T}c(u,v)

flow network의 minimum cut은 네트워크의 모든 cut 중 용량이 최소가 되는 cut을 의미한다.

정리 1

cut에 대한 정의를 바탕으로 다음과 같은 정리를 증명해보자.

For any cut(S,T)\text{cut}(S,T), f(S,T)=ff(S, T) = |f|.

이전 시간에 flow network의 flow는 flow conservation을 지켜야 했다. 그렇기에 uVs,tu \in V - {s, t}에 대해 다음과 같이 flow conservation을 다시 쓸 수 있다.

vVf(u,v)=vVf(v,u)\sum_{v \in V} f(u, v) = \sum_{v \in V} f(v, u)

f|f|의 정의는 다음과 같았다.

f=vVf(s,v)vVf(v,s)\begin{aligned} |f| &= \sum_{v \in V} f(s, v) - \sum_{v \in V}f(v, s) \end{aligned}

flow conservation 식을 이용하면 다음과 같이 쓸 수 있다.

f=vVf(s,v)vVf(v,s)=vVf(s,v)vVf(v,s)+uS{s}(vVf(u,v)vVf(v,u))=vVf(s,v)+uS{s}vVf(u,v)vVf(v,s)+uS{s}vVf(v,u)=vV(f(s,v)uS{s}f(u,v))vV(f(v,s)uS{s}f(v,u))=vVuSf(u,v)vVuSf(v,u)\begin{aligned} |f| &= \sum_{v \in V} f(s, v) - \sum_{v \in V}f(v, s)\\ &= \sum_{v \in V} f(s, v) - \sum_{v \in V}f(v, s) + \sum_{u \in S - \{s\}}\left(\sum_{v \in V} f(u, v) - \sum_{v \in V} f(v, u) \right)\\ &= \sum_{v \in V}f(s,v) + \sum_{u \in S-\{s\}}\sum_{v \in V}f(u,v) - \sum_{v \in V}f(v,s) + \sum_{u \in S-\{s\}}\sum_{v \in V}f(v,u)\\ &= \sum_{v \in V} \left(f(s, v) - \sum_{u \in S - \{s \}} f(u, v)\right) - \sum_{v \in V} \left(f(v, s) - \sum_{u \in S - \{s \}} f(v, u)\right)\\ &= \sum_{v \in V}\sum_{u \in S} f(u, v) - \sum_{v \in V}\sum_{u \in S} f(v, u) \end{aligned}

여기서 VVSTS \cup T%이고 ST=S \cap T = \empty이므로,

f=uSvTf(u,v)uSvTf(v,u)=f(S,T) : net flow\begin{aligned} |f| &= \sum_{u \in S}\sum_{v \in T}f(u,v) - \sum_{u \in S}\sum_{v \in T}f(v,u)\\ &= f(S, T) \text{ : net flow} \end{aligned}

정리 2

The value of any flow \le capacity of any cut.

앞의 정리 1에 의해 cut(S,V)\text{cut}(S, V)에 대해 다음이 성립한다.

f=f(S,T)|f| = f(S, T)

net flow의 정의에 의해 다음이 성립한다.

f(S,T)=uSvTf(u,v)uSvTf(v,u)uSvTf(u,v)uSvTc(u,v)=c(S,T)\begin{aligned} f(S, T) &= \sum_{u \in S} \sum_{v \in T} f( u,v ) -\sum_{u \in S} \sum_{v \in T} f( v,u ) \\ &\le \sum_{u \in S} \sum_{v \in T} f( u,v )\\ &\le \sum_{u \in S} \sum_{v \in T} c(u, v) = c(S, T) \end{aligned}

그러므로 어떤 flow network의 maximum flow는 항상 flow network의 minimum cut의 용량보다 작거나 같다. 이를 통해 Max-flow Min-Cut 정리를 유도할 수 있다.

Max-Flow Min-Cut Theorem

다음은 동치이다.
1. GG의 절단 cut(S,T)\text{cut}(S, T)에 대해 f=c(S,T)|f| = c(S, T)이다.
2. ffGG의 최대 유량(maximum flow)이다.
3. 잔여 네트워크(residual network) GfG_f는 증강 경로를 가질 수 없다.

1.2.1. \rightarrow 2. 그리고 2.32. \rightarrow 3 마지막으로 313 \rightarrow 1의 순서로 증명해보자. 우선 모든 cut에 대해 fc(S,T)|f| \le c(S, T)가 성립한다. 여기서 f=c(S,T)|f| = c(S, T)가 되면 ff는 더 이상 증가하지 않을 것이다. 그러므로 ff가 최대 유량이 된다. 그리고 232 \rightarrow 3을 귀류법으로 증명해보자. ff가 최대 유량이 아니라면, GfG_f의 증강 경로에 의해 f|f|가 증가할 수 있게 된다. 정리 2에서 f|f|의 상한선은 c(S,T)c(S, T)이므로 모순이 된다. 마지막으로 3.1.3. \rightarrow 1.를 증명해보자.

우선 GfG_f에 증강 경로가 없다고 가정하고 다음 그림과 같은 cut을 생각해보자.

S={vV, there exists a path in Gf from s to v}T=VS\begin{aligned} S &= \{v \in V, \text{ there exists a path in }G_f \text{ from }s \text{ to }v\}\\ T &= V -S \end{aligned}

위와 같은 cut에서 (u,v)E(u, v) \in E이면, f(u,v)=c(u,v)f(u, v) = c(u, v)가 된다. 그렇지 않다면, (u,v)Ef(u, v) \in E_f가 되므로 vv가 집합 SS에 속해야 한다. 그리고 (v,u)E(v, u) \in E이면, f(v,u)=0f(v, u) = 0이 되어야 한다. 그렇지 않다면, c(v,u)c(v, u)가 양수가 되고 이는 (v,u)Ef(v, u) \in E_f이므로 vv가 집합 SS에 속하는 모순이 발생한다. 결론적으로 다음이 성립한다는 의미이다.

f(S,T)=uSvTf(u,v)uSvTf(v,u)=uSvTc(u,v)uSvT0=c(S,T)\begin{aligned} f(S, T) &= \sum_{u \in S} \sum_{v \in T} f( u,v ) -\sum_{u \in S} \sum_{v \in T} f( v,u ) \\ &= \sum_{u \in S} \sum_{v \in T} c( u,v ) -\sum_{u \in S} \sum_{v \in T} 0\\ &= c(S, T) \end{aligned}

Basic Ford-Fulkerson Method

Introduction에서 설명한 포드-풀커슨 방법에 앞에서 언급한 정리들을 활용하여 수도 코드로 작성한 결과이다. 이를 적용하여 다음의 예제를 살펴보자.

(a)를 보면, 주어진 flow network에 초기에 f=0f = 0으로 초기화한다. 그 후 (b)와 같이 residual network를 만들 수 있고, 잔여 네트워크의 증강 경로 pp를 찾아 cf(p)c_f(p)를 구하면 4가 된다. 그 후 line 5~8의 반복문을 따라가며 해당 증강 경로 pp에 속하는 edge(u,v)(u, v)가 flow network GGEE에 속한다면 cf(p)c_f(p)만큼 더하고 속하지 않는다면 cf(p)c_f(p)를 빼준다. 그 결과가 (b)의 오른쪽 그래프와 같다. 이에 대한 잔여 네트워크를 다시 구하면 (c)와 같고, 증강 경로 pp가 존재하는 것을 확인할 수 있다. 이 증강 경로의 cf(p)c_f(p)를 구하면 또 4이고, 다시 line 5~8의 반복문을 따라가면 (c)의 오른쪽 그래프를 얻을 수 있다. 이 과정을 아래 그림의 (e)까지 반복한다.

(e)의 오른쪽 flow network의 잔여 네트워크를 구하면 (f)와 같고, 더 이상 잔여 네트워크에 증강 경로가 존재하지 않기 때문에 (e)의 flow가 최대 유량(maximum flow = 23)가 된다.

Analysis of Ford-Fulkerson

포드-풀커슨 방법의 수행시간은 line 3의 증강 경로 pp를 찾는 방법에 의해 결정된다. 증강 경로를 잘못 선택하면 알고리즘이 종료되지 않거나 최대 유량으로 수렴하지 않을 수도 있는데, 이는 너비 우선 탐색(BFS) 방법을 이용하여 증강 경로를 찾아 해결할 수 있다. BFS를 사용하면 잔여 네트워크에 존재하는 증강 경로 pp를 찾는데 걸리는 시간은 O(V+E)=O(E)O(V + E^{\prime}) = O(E)이다. 여기까지는 line 3이후의 while문을 수행하는데 걸리는 시간이고 line 1~2에 의해 ff값을 초기화하는데 걸리는 시간은 f|f^*|가 된다. 여기서 ff^{*}는 변환된 flow network에서 최대 flow를 의미한다. 그러므로 포드-풀커슨 방법의 전체 수행시간은 O(Ef)O(E |f^*|)이다.

그럼 만약 f|f^*|가 상당히 큰 값을 가지는 경우 포드-풀커슨 방법은 얼마나 오래 걸릴까?

(a)의 f|f^{*}|2,000,0002,000,000이다. (a)에 대해 포드-풀커슨 방법을 적용하면, flow는 1증가한다. flow를 1 증가시킨 flow network의 잔여 네트워크는 (b)와 같다. (b)에서 증강 경로를 그림과 같이 찾을 수 있고, 해당 경로의 cf(p)=1c_f(p) = 1이 되므로, flow를 1 증가시킨다. 그럼 flow는 2가되고, 해당 flow network의 잔여 네트워크를 다시 그리면 (c)와 같다. 이 과정을 계속해서 반복해나가면 최종적으로 2,000,0002,000,000에 도달할 때까지 flow를 1씩 증가시키게 된다.

Edmonds-Karp Algorithm

포드-풀커슨 방법은 알고리즘이 아니라 '방법'이다. 그 이유는 포드-풀커슨 방법을 이용하여 시간 복잡도를 개선한 여러 알고리즘이 있기 때문이다. 그 중 에드몬드-카프 알고리즘은 증강 경로 pp를 찾는데 BFS를 활용하여 최단 경로를 찾는다. 우선 다음과 같은 정리를 보자.

For all vV{s,t}v \in V - \{s, t\}, δf(s,v)\delta_f(s, v) increases monotonically with each flow augmentation.

에드몬드-카프 알고리즘을 GG에 적용될 때, source와 sink인 s,ts, t를 제외한 모든 vertex의 대한 flow가 증가함에 따라 δf\delta_f, 즉 shortest-path distance 값도 증가한다는 의미이다. 왜 그런지 알아보자.

위 정리와 반대로 vertex vV{s,t}v \in V - \{s, t \}에 대해 ss에서 vv로의 shortest-path distance를 감소시키는 flow augmentation이 존재한다고 가정하자. ff가 기존의 flow, 증강 후가 ff^{\prime}이라 하자. 즉,

δf(s,v)<δf(s,v)\delta_{f^{\prime}}(s,v) < \delta_f(s, v)

이 성립한다. 증강 후, 잔여 네트워크에서 찾은 ss에서 vv로 가는 최단 경로 p=suvp = s \rightsquigarrow u \rightarrow v에 대해 다음이 성립한다.

δf(s,v)=δf(s,u)+1\delta_{f^{\prime}} (s, v) = \delta_{f^{\prime}}(s, u) + 1

vv를 선택하는 방법 때문에 ss에서 uu까지의 거리가 감소하지는 않을 것이다. 그렇기에 다음이 성립한다.

δf(s,u)δf(s,u)\begin{aligned} \delta_{f^{\prime}}(s, u) \ge \delta_{f}(s,u) \end{aligned}

여기서 만약 (u,v)Ef(u, v) \in E_f라면,

δf(s,v)δf(s,u)+1 : by tranignle inequality.δf(s,u)+1=δf(s,v)\begin{aligned} \delta_f(s,v) &\le \delta_f(s, u) + 1 \text{ : by tranignle inequality.}\\ &\le \delta_{f^{\prime}}(s,u) + 1 = \delta_{f^{\prime}}(s,v) \end{aligned}

이는 우리의 최초 전제에 모순이다. 그러므로 (u,v)Ef(u, v) \notin E_f가 된다. 그렇다면 (u,v)Ef(u,v) \in E_{f^{\prime}}이라는 소리인데,

δf(s,v)=δf(s,u)1\begin{aligned} \delta_f(s,v) = \delta_f (s, u) - 1 \end{aligned}

이다. 위 식에 앞서 이야기한 부등식과 식을 적용시키면,

δf(s,u)1δf(s,u)1=δf(s,v)2\begin{aligned} \delta_f (s, u) - 1 &\le \delta_{f^{\prime}}(s, u) -1\\ & = \delta_{f^{\prime}}(s,v) - 2 \end{aligned}

가 되는데 이 결론도 최초 전제에 모순이다. 즉 ss에서 vv로의 최단 경로 거리를 감소시키는 augmenting flow는 존재하지 않는다는 소리이다. 이를 통해 다음 정리를 성립시킬 수 있다.

에드몬드-카프 알고리즘이 flow network G=(V,E)G = (V, E)에 대해 수행되면, 플로 증강의 총 횟수는 O(VE)O(VE)가 된다.

잔여 네트워크 GfG_f의 edge(u,v)(u, v)(u,v)(u, v)가 존재하는 어떤 증강 경로 pp에 대해, cf(u,v)=cf(p)c_f(u, v) = c_f(p)라면, 해당 edge(u,v)(u, v)critical edge라고 한다. 증강 경로를 따라 augmentation 연산을 수행하고 나면, 해당 critical edge는 다음 잔여 네트워크 GfG_{f^{\prime}}에서 사라진다. 그리고 critical edge는 항상 모든 증강 경로에 존재하게 된다. 그렇다면 모든 E|E|개의 edge에 대해서 각 edge는 최대 V/2|V|/2번 critical edge가 될 수 있다. 잔여 그래프에서 간선을 만들 수 있는 O(E)O(E)개의 정점 쌍이 존재하기에, 에드몬드-카프 알고리즘이 모두 수행되는 동안 critical edge의 총 개수는 O(VE)O(VE)가 된다. 증강 경로를 BFS로 찾기에 이때 걸리는 시간은 O(E)O(E)이므로, 에드몬드-카프 알고리즘의 총 수행시간은 O(VE2)O(VE^2)이 된다.

profile
고분자/컴공

0개의 댓글