728x90
축사에 소를 배치하려고 할 때, 소들이 원하는 축사에 들어갈 수만 있다면
최대로 넣을 수 있는 소들의 수를 구하는 문제입니다.
1. 소 A가 원하는 축사가 비어있다면 넣어줍니다.
2. 소 A가 원하는 축사에 다른 소 B가 있다면
- 소 B가 이동 할 수 있는지 확인합니다. [소 B는 1~2번의 과정을 반복]
3. 이동에 성공하면 소 A를 축사에 넣고 카운트를 증가합니다.
실패했다면 카운트를 증가시키지 않습니다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int visit[210];
int room[210];
vector<vector<int>> v;
int solve(int x)
{
if (visit[x]) {
return 0;
}
visit[x] = 1;
for(int go : v[x]){
if (!room[go] || solve(room[go])) {
room[go] = x;
return 1;
}
}
return 0;
}
int main(int argc, char *argv[])
{
int n, m;
cin >> n;
cin >> m;
memset(room, 0, sizeof(room));
for (int i = 0; i <= n; ++i) {
vector<int> element;
v.push_back(element);
}
for (int i = 1; i <= n; ++i) {
int want;
cin >> want;
for (int j = 0; j < want; ++j) {
int num;
cin >> num;
v[i].push_back(num);
}
}
int count = 0;
for (int i = 1; i <= n; ++i) {
fill(begin(visit), end(visit), 0);
if (solve(i)) {
++count;
}
}
cout << count << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 9020번 골드바흐의 추측 (0) | 2019.08.30 |
---|---|
[C++] 백준 2352번 반도체 설계 (0) | 2019.08.28 |
[C++] 백준 1931번 회의실배정 (0) | 2019.08.27 |
[C++] 백준 1806번 부분합 (0) | 2019.08.27 |
[C++] 백준 10828번 스택 (0) | 2019.08.26 |