문제


https://www.acmicpc.net/problem/14286


풀이


최대 유량 최소 컷 정리를 사용하는 기본 문제이다.

문제에서 설명하는 최소 컷은 동일 flow network에서 최대 유량과 동일하다.


코드


import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())
graph = [[0] * (n + 1) for _ in range(n + 1)]

for _ in range(m):
    start, end, capacity = map(int, sys.stdin.readline().split())
    graph[start][end] += capacity
    graph[end][start] += capacity

s, t = map(int, sys.stdin.readline().split())

ans = 0
while True:
    prev = [-1] * (n + 1)
    queue = deque([(s, float('inf'))])
    while queue:
        cur, res = queue.popleft()
        
        if graph[cur][t]:
            res = min(res, graph[cur][t])
            prev[t] = cur
            break
        
        for nxt in range(1, n + 1):
            if (prev[nxt] == -1) and graph[cur][nxt]:
                prev[nxt] = cur
                queue.append((nxt, min(res, graph[cur][nxt])))

        if prev[t] != -1:
            break
    
    if prev[t] == -1:
        break

    ans += res
    nxt = t
    while nxt != s:
        cur = prev[nxt]
        graph[cur][nxt] -= res
        graph[nxt][cur] += res
        nxt = cur

print(ans)

Leave a comment