문제


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


풀이


세 개 학년을 두 조로 나누면 한 조는 한 학년, 다른 한 조는 두 학년을 포함하게 된다.

이때 두 학년을 포함한 조의 학생들을 조건을 만족하면서 최대로 만들어주면 된다.

사이가 안 좋은 학생들 사이를 엣지로 이어 이분 그래프에서 생각해 보면, 최대 매칭이 0일 때까지 학생을 줄여야 하므로 maximal independent set의 크기를 구하는 것과 동일하다.

이는 전체 학생 수에서 minimum vertex cover의 크기, 즉 최대 매칭 수를 뺀 것과 같다.


코드


import sys


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


n = int(sys.stdin.readline())
data = sys.stdin.readline().strip()
board = [sys.stdin.readline().strip() for _ in range(n)]
ans = float('inf')

for x, y in [('1', '2'), ('1', '3'), ('2', '3')]:
    graph = [[] for _ in range(n)]

    for i in range(n):
        if data[i] == x:
            for j in range(n):
                if (data[j] == y) and (board[i][j] == 'Y'):
                    graph[i].append(j)

    b = [-1] * n
    flow = 0
    for i in range(n):
        visit = [0] * n
        flow += dfs(i)

    ans = min(ans, flow)

print(n - ans)

Leave a comment