728x90
이분매칭으로 문제를 해결했습니다.
한명씩 책과 짝짓고, 만약 책이 이미 어떤사람에게 부여되어 있다면,
그 사람이 다른 책을 선택할 수 있는지 확인해서 바꾸는 방식입니다.
#include <iostream>
#include <vector>
using namespace std;
vector<pair<int, int> > v(1010);
int work[1010];
bool finish[1010];
bool DFS(int x)
{
int size = v[x].second - v[x].first + 1;
for (int i = 0; i < size; ++i) {
int t = v[x].first + i;
if (finish[t]) {
continue;
}
finish[t] = true;
if (work[t] == 0 || DFS(work[t])) {
work[t] = x;
return true;
}
}
return false;
}
int main(int argc, char* argv[])
{
int t;
int n, m;
int start, end;
int count;
cin >> t;
while (t--) {
count = 0;
cin >> n >> m;
v.clear();
v.push_back({ 0, 0 });
for (int i = 1; i <= m; ++i) {
cin >> start;
cin >> end;
v.push_back({ start, end });
}
fill(work, work + 1010, 0);
for (int i = 1; i <= m; ++i) {
fill(finish, finish + 1010, false);
if (DFS(i)) {
++count;
}
}
cout << count << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 1517번 버블 소트 (0) | 2020.03.06 |
---|---|
[C++] 백준 1083번 소트 (0) | 2020.03.06 |
[C++] 백준 11931번 수 정렬하기 4 (0) | 2020.01.13 |
[C++] 백준 17144번 미세먼지 안녕! (0) | 2020.01.04 |
[C++] 백준 15685번 드래곤 커브 (0) | 2019.12.30 |