단 여기서는 한 사람당 2개까지의 일을 맡을 수 있다. 그런데 간단하게 생각해보면, visited 초기화 후 dfs호출을 두 번 해주기만 해도 된다. 허허...
p.s. dfs 함수 호출 자체에 시간이 매우 오래 소요되므로, 우선 추가적인 매칭 과정 없이 할 수 있는 일 (works[idx] == -1) 부터 탐색하는 게 훨씬 싸게 먹힌다. 얼핏 보면 코드가 깔끔해 보이지 않을 수 있는데, 이런 이유로 dfs 내부 for문을 중복해서 사용했다.
풀이 코드
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N, M = map(int, input().split())
worker_list = [tuple(map(int, input().split()))[1:] for _ in range(N)]
works = [-1]*(M+1)
ans = 0
def dfs(worker) :
if visited[worker] :
return False
visited[worker] = True
for work in worker_list[worker] :
if works[work] == -1 :
works[work] = worker
return True
for work in worker_list[worker] :
if dfs(works[work]) :
works[work] = worker
return True
return False
for i in range(N) :
visited = [False]*N
if dfs(i) :
ans += 1
visited = [False]*N
if dfs(i) :
ans += 1
if ans == M :
break
print(ans)