축사 배정 
https://www.acmicpc.net/problem/2188
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 13113 | 6284 | 4114 | 48.785% |
문제
농부 존은 소 축사를 완성하였다. 축사 환경을 쾌적하게 유지하기 위해서, 존은 축사를 M개의 칸으로 구분하고, 한 칸에는 최대 한 마리의 소만 들어가게 계획했다.
첫 주에는 소를 임의 배정해서 축사를 운영했으나, 곧 문제가 발생하게 되었다. 바로 소가 자신이 희망하는 몇 개의 축사 외에는 들어가기를 거부하는 것이다.
농부 존을 도와 최대한 많은 수의 소가 축사에 들어갈 수 있도록 하는 프로그램을 작성하시오.
축사의 번호는 1부터 M까지 매겨져 있다.
입력
첫째 줄에 소의 수 N과 축사의 수 M이 주어진다. (1 ≤ N, M ≤ 200)
둘째 줄부터 N개의 줄에는 각 소가 들어가기 원하는 축사에 대한 정보가 주어진다.
i번째 소가 들어가기 원하는 축사의 수 Si (0 ≤ Si ≤ M)이 먼저 주어지고, 이후 Si개의 축사 번호가 주어진다.
같은 축사 번호가 두 번 이상 주어지는 경우는 없다.
출력
첫째 줄에 축사에 들어갈 수 있는 소의 최댓값을 출력한다.
예제 입력 1
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
예제 출력 1
4
https://www.acmicpc.net/board/view/137221
예제 입력 A
4 3 1 1 1 2 1 3 1 3
예제 출력 A
3
예제 입력 B
4 3 0 0 0 0
예제 출력 B
0
예제 입력 C
4 3 1 1 1 2 2 1 2 2 1 2
예제 출력 C
2
예제 입력 D
50 40 2 24 21 1 39 4 30 31 15 18 2 21 3 4 21 40 39 30 1 20 5 20 30 4 29 25 3 39 9 33 1 32 5 27 22 36 2 11 1 9 5 35 29 14 38 1 3 28 22 1 4 18 20 29 22 3 5 11 38 2 36 30 5 9 17 35 10 19 3 18 31 7 3 4 36 30 4 24 12 9 14 3 28 2 27 3 13 6 2 3 6 37 39 4 5 26 15 16 3 25 6 36 2 9 31 3 17 6 7 5 27 4 13 29 30 1 1 1 12 5 3 1 38 8 5 2 14 12 3 17 39 12 3 30 15 26 2 21 3 3 7 6 11 2 28 13 2 25 16 2 19 16 1 13 5 39 24 34 29 33 2 40 10 3 6 35 40 1 37 2 24 35 4 11 22 3 29 3 19 7 16 1 14 1 38 5 31 14 28 19 6
예제 출력 D
39
출처
알고리즘 분류
통과된 코드
#include <iostream> #include <vector> #include <cstring> using namespace std; int N, M; vector<int> cowInfo[201]; // 각 소가 원하는 축사 리스트 int barnMatch[201]; // barnMatch[b] = 소 번호 (b번 축사에 배정된 소) bool visited[201]; // DFS 방문 체크 // 축사 매칭 시도 bool DFS(int cow) { for (int barn : cowInfo[cow]) { if (visited[barn]) continue; visited[barn] = true; // 이 축사가 비었거나, 이미 배정된 소가 다른 축사로 갈 수 있다면 if (barnMatch[barn] == 0 || DFS(barnMatch[barn])) { barnMatch[barn] = cow; return true; } } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for (int i = 1; i <= N; i++) { int k, barn; cin >> k; for (int j = 0; j < k; j++) { cin >> barn; cowInfo[i].push_back(barn); } } int result = 0; for (int i = 1; i <= N; i++) { memset(visited, false, sizeof(visited)); if (DFS(i)) result++; } cout << result << "\n"; return 0; }