문제


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


풀이


이분 그래프에서 maximum matching의 크기와 minimum vertex cover의 크기가 같다는 Kőnig’s Theorem을 이용하면 쉽게 풀린다.

왼쪽에 x좌표를 의미하는 1~n을 놓고, 오른쪽에 y좌표를 의미하는 1~n을 놓자.

(c, d) 위의 돌멩이는 x=c를 훑거나, y=d를 훑으면 치워진다.

그러므로 (c, d) 엣지를 이어주면, vertex cover를 만들었을 때 돌멩이가 치워지게 된다.


코드


import sys


def dfs(cur):
    visit[cur] = 1
    for nxt in graph[cur]:
        if not b[nxt] or (not visit[b[nxt]] and dfs(b[nxt])):
            b[nxt] = cur
            return 1
    return 0


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

for _ in range(m):
    x, y = map(int, sys.stdin.readline().split())
    graph[x].append(y)

b = [0] * (n + 1)
ans = 0

for i in range(1, n + 1):
    visit = [0] * (n + 1)
    ans += dfs(i)

print(ans)

Leave a comment