문제
무방향 가중 그래프에서, 모든 정점 쌍 \((s, t)\)의 최소 \(s\)–\(t\) 컷(= 최대 흐름) 값을 알고 싶다. 쌍이 \(\binom{n}{2}\)개이니 각각 max-flow를 돌리면 \(O(n^2)\)번. 고모리–후 트리(Gomory–Hu tree) 는 단 \(n-1\)번의 max-flow로 모든 쌍의 최소 컷을 담는 트리를 만든다.
정의
고모리–후 트리는 원래 정점들 위의 가중 트리 \(T\)로, 다음을 만족한다.
임의의 \(s, t\)에 대해, \(T\)의 \(s\)–\(t\) 경로 위 최소 가중치 간선 의 값이 원래 그래프의 최소 \(s\)–\(t\) 컷 값과 같다. 또 그 간선을 제거해 생기는 트리의 두 부분이 실제 최소 컷의 한 분할을 준다.
즉 트리 경로의 병목 간선이 곧 최소 컷. 모든 쌍 정보를 \(n-1\)개 숫자로 압축한 것이다.
왜 가능한가: 최소 컷의 비교차성
핵심은 무방향 그래프 최소 컷의 부분모듈/비교차(submodular, uncrossing) 성질이다. 두 최소 컷이 "교차"하면, 더 작거나 같은 두 개의 비교차 컷으로 바꿀 수 있다(uncrossing lemma). 따라서 모든 쌍 최소 컷이 라미나(laminar)·트리 구조로 정리될 수 있다.
또 다음 삼각 부등식류가 성립한다:
$$ \lambda(s, t) \ge \min(\lambda(s, r),\ \lambda(r, t)). $$
여기서 \(\lambda\)는 최소 컷 값. 이로부터 \(n\)개 정점의 모든 쌍 \(\lambda\) 값이 사실상 \(n-1\)개의 "결정적" 값으로 결정된다는 점이 트리 표현의 근거다.
Gusfield의 간단한 버전
원조 Gomory–Hu는 정점 수축이 필요해 구현이 번거롭다. Gusfield의 변형 은 수축 없이 같은 트리를 만든다.
parent[i] = 0 (모든 i > 0 의 부모를 0으로 초기화)
for s = 1 .. n-1:
t = parent[s]
f = maxflow(s, t) # 원래 그래프에서
weight[s] = f
(S, V\S) = min-cut의 s쪽 집합
for i = s+1 .. n-1:
if i in S and parent[i] == t:
parent[i] = s # 부모 재배선
if parent[t] in S: # Gusfield 보정
parent[s] = parent[t]; parent[t] = s; weight[s] = weight[t]; weight[t] = f
각 반복에서 max-flow를 한 번씩, 총 \(n-1\)번. min-cut의 한쪽 집합은 잔여 그래프에서 \(s\)로부터 도달 가능한 정점들.
결과 트리의 사용
\(\lambda(u, v)\) = \(T\)에서 \(u\)–\(v\) 경로의 최소 간선 가중치. DFS/희소 테이블로 경로 최솟값을 \(O(\log n)\) 또는 \(O(1)\)에 질의.
복잡도
\(n-1\)번의 max-flow. 일반 그래프 max-flow가 \(O(F)\)면 전체 \(O(nF)\). 모든 쌍을 따로 푸는 \(O(n^2\ F)\) 대비 \(n\)배 빠르다.
다음 강의에서 Gusfield 변형의 완전한 구현을 본다.