도구스학업·수학

최대 유량(네트워크 플로우) 계산기

간선마다 용량이 정해진 그래프에서 출발점에서 도착점으로 한 번에 보낼 수 있는 최대 유량을 구하고, 같은 값이 되는 최소 컷의 간선까지 짚어 줍니다. 늘리는 길을 찾는 과정과 역방향으로 되무르는 자리도 회차별로 보여 줍니다.

한 줄에 «출발 도착 용량» 하나씩. 방향이 있는 그래프입니다. 정점 30개까지.

s 에서 t 로

5만큼

잘라 낸 간선 2개의 용량 합도 정확히 5입니다 — 최대 유량과 최소 컷이 같다는 정리입니다.

최대 유량5
최소 컷 용량5
늘리는 길을 찾은 횟수3번
유량 규칙 검사통과 (용량·보존)

늘리는 길을 하나씩

회차흘린 양누적
1s → a → t22
2s → b → t24
3s → a → b → t15

한 번에 흘리는 양은 그 길에서 가장 좁은 곳입니다. 길을 고를 때 간선 수가 가장 적은 것을 고르는 것이 에드몬드–카프이고, 그래야 반복 횟수가 용량의 크기와 무관해집니다.

간선마다의 유량

간선유량 / 용량상태
ab1 / 2여유
at2 / 2꽉 참
bt3 / 3꽉 참
sa3 / 3
sb2 / 2

최소 컷

출발점 쪽

s

도착점 쪽

a, b, t

끊어야 할 간선

s→a (3), s→b (2)

잔여 그래프에서 s에서 아직 갈 수 있는 정점들이 컷의 한쪽입니다. 더 흘릴 길이 없다는 것은 그 경계를 건너는 정방향 간선이 모두 꽉 찼다는 뜻이고, 그 간선들을 끊으면 st가 떨어집니다. 그래서 잘린 용량의 합이 곧 병목이고 최대 유량과 같아집니다.

역방향 잔여 간선이 왜 필요한가. 욕심껏 흘리다 보면 나중에 후회하는 배분이 생깁니다. 그래서 흘린 방향의 반대쪽에 같은 만큼 잔여 용량을 만들어 둡니다. 나중에 그 역방향을 타면 앞서 흘린 것을 그만큼 무르는 셈이라, 한 번 잘못 배분해도 최적에 닿을 수 있습니다. 이 장치가 없으면 알고리즘이 어중간한 답에서 멈춥니다 — 위 「되무르기」 예제를 넣어 보면 세 번째 회차에서 실제로 무르는 것이 보입니다.
왜 하필 너비 우선인가. 늘리는 길을 아무렇게나 고르면 용량이 클 때 반복이 폭발할 수 있습니다. 「용량이 큰 판」 예제는 가운데 용량 1짜리 간선을 오가며 1씩 200만 번을 흘리게 만드는 유명한 최악의 경우인데, 간선 수가 가장 적은 길을 고르면 두 번에 끝납니다. 반복 횟수가 용량의 «크기»와 무관해지는 것이 에드몬드–카프의 핵심입니다.
이 도구는 결과를 내고 나서 유량 규칙을 다시 검사합니다 — 어떤 간선도 용량을 넘지 않을 것, 출발점·도착점을 뺀 모든 정점에서 들어온 양과 나간 양이 같을 것. 같은 쌍에 간선이 여럿이면 용량을 더해 한 줄로 묶고, 용량은 0 이상만 다룹니다.

계산 방법

  1. 1간선을 한 줄에 하나씩 «출발 도착 용량» 형식으로 적습니다.
  2. 2출발점과 도착점을 고릅니다.
  3. 3최대 유량과, 같은 값이 되는 최소 컷 용량을 확인합니다.
  4. 4「늘리는 길을 하나씩」에서 회차마다 어디로 얼마를 흘렸는지 봅니다.
  5. 5최소 컷에서 어느 간선을 끊으면 두 점이 떨어지는지 확인합니다.

자주 묻는 질문

남은 용량이 있는 길을 찾아 흘릴 수 있는 만큼 흘리는 것을 더 찾을 길이 없을 때까지 되풀이합니다. 한 번에 흘리는 양은 그 길에서 가장 좁은 곳의 남은 용량입니다. 이 도구는 길을 고를 때 간선 수가 가장 적은 것을 너비 우선으로 고르는 에드몬드–카프를 씁니다.

그래프를 출발점 쪽과 도착점 쪽으로 갈랐을 때 건너가는 간선들의 용량 합이 가장 작아지는 자름이 최소 컷이며, 그 값은 최대 유량과 정확히 같습니다. 다 흘리고 난 뒤 잔여 그래프에서 출발점으로부터 갈 수 있는 정점을 모으면 그것이 컷의 한쪽인데, 더 흘릴 길이 없다는 것은 그 경계를 건너는 간선이 모두 꽉 찼다는 뜻이라 그 용량 합이 곧 병목입니다.

앞서 흘린 배분을 되무를 수 있어야 최적에 닿기 때문입니다. 흘린 방향의 반대쪽에 같은 만큼 잔여 용량을 만들어 두면, 나중에 그 역방향을 타는 것이 곧 앞서 흘린 것을 그만큼 무르는 셈이 됩니다. 이 장치가 없으면 욕심껏 흘린 뒤 어중간한 답에서 멈춥니다.

반복 횟수를 용량의 크기와 무관하게 만들기 위해서입니다. 길을 아무렇게나 고르면 용량 1짜리 간선을 오가며 1씩 수백만 번 흘리는 일이 생길 수 있지만, 간선 수가 가장 적은 길을 고르면 반복이 정점·간선 수만으로 묶입니다. 이것이 포드–풀커슨과 에드몬드–카프의 차이입니다.

푸는 문제가 다릅니다. 최단경로는 「가장 짧은 길 하나」를 찾고, 최대 유량은 「여러 길로 나눠 보낼 수 있는 총량」을 구합니다. 최대 유량에서는 한 경로만으로는 답이 나오지 않고 여러 경로에 유량을 나눠 싣는 것이 보통입니다.

이 도구는 결과를 내고 나서 유량 규칙을 다시 검사합니다. 어떤 간선도 용량을 넘지 않을 것, 그리고 출발점과 도착점을 뺀 모든 정점에서 들어온 양과 나간 양이 같을 것(보존) 두 가지이며, 화면에 통과 여부를 표시합니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 널리 알려진 교과서 예제(CLRS 26장)의 최대 유량 23과 대조해 고정했습니다. 최소 컷이 v1→v3, v4→v3, v4→t 세 간선이고 용량 합이 23인 것, 컷의 양쪽이 {s, v1, v2, v4}와 {t, v3}로 갈리는 것까지 확인했습니다.
  • 길을 고르는 방식이 다른 두 번째 구현과 대조합니다. 여기서는 너비 우선으로 가장 짧은 길을 고르지만, 깊이 우선으로 아무 길이나 고르는 포드–풀커슨도 같은 최대 유량에 닿아야 합니다. 무작위 그래프 200개에서 두 방법의 답이 같은 것을 확인했습니다.
  • 최대 유량과 최소 컷이 같다는 것은 정리이면서 검산이기도 합니다. 유량 쪽과 컷 쪽은 서로 다른 계산이므로 둘이 어긋나면 어딘가 틀린 것이고, 모든 예제와 무작위 그래프에서 매번 확인합니다.
  • 잘린 간선이 모두 꽉 차 있는 것, 컷을 거꾸로 건너는 간선에는 유량이 0인 것도 테스트로 고정했습니다. 최소 컷이 왜 병목인지의 근거가 그것입니다.
  • 역방향 잔여 간선을 실제로 쓰는 그래프를 찾아 예제로 넣었습니다. 세 번째 회차에서 b → a라는 없는 방향으로 흘러 앞서 흘린 것을 무르며, 그러고도 유량 규칙을 지키는 것을 확인했습니다.
  • 용량이 큰 판(200만)에서도 두 번의 반복으로 끝나는 것을 고정했습니다. 길을 아무렇게나 고르는 방법이라면 200만 번이 걸리는 유명한 최악의 경우입니다.
  • 간선 입력은 dijkstra-path와 같은 파서를 씁니다. 같은 쌍에 간선이 여럿이면 용량을 더해 한 줄로 묶고, 정점은 30개까지 다룹니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.