728x90
이분매칭으로 문제를 해결했습니다.
https://j3sung.tistory.com/409
[C++] 백준 11375번 열혈강호
이분 매칭으로 문제를 해결하였습니다. N명의 직원이 있고 해야할 일이 M개가 있을 때 직원들이 할 수 있는 일들이 정해져있고 하나의 일만 할 수 있습니다. 이 때 일을 잘 분배해서 가장 많이 할 수 있는 일의..
j3sung.tistory.com
이 문제와 같이 일을 한개할 때의 경우를 계산합니다.
그리고 추가적으로 일을 할 수 있는 경우를 찾습니다.
찾는 경우 카운트를 증가해주고 벌점의 수만큼 이를 반복해줍니다.
중간에 추가적으로 할 수 있는 경우가 없으면
반복문을 종료하고 count를 출력합니다.
#include <iostream>
#include <vector>
using namespace std;
vector<int> v[1010];
int work[1010];
bool visit[1010];
bool DFS(int x)
{
for (int i = 0; i < v[x].size(); ++i) {
int t = v[x][i];
if (visit[t]) {
continue;
}
visit[t] = true;
if (work[t] == 0 || DFS(work[t])) {
work[t] = x;
return true;
}
}
return false;
}
int main(int argc, char *argv[])
{
bool flag = true;
int n, m, k;
int c;
int num;
int count = 0;
scanf("%d", &n);
scanf("%d", &m);
scanf("%d", &k);
for (int i = 1; i <= n; ++i) {
scanf("%d", &c);
for (int j = 0; j < c; ++j) {
scanf("%d", &num);
v[i].push_back(num);
}
}
fill(work, work + 1010, 0);
for (int i = 1; i <= n; ++i) {
fill(visit, visit + 1010, false);
if (DFS(i)) {
++count;
}
}
while (k > 0 && flag) {
for (int i = 1; i <= n; ++i) {
fill(visit, visit + 1010, false);
if (DFS(i)) {
flag = true;
++count;
--k;
break;
}
else {
flag = false;
}
}
}
printf("%d\n", count);
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 17521번 Byte Coin (0) | 2019.10.14 |
---|---|
[C++] 백준 17520번 Balanced String (0) | 2019.10.14 |
[C++] 백준 11377번 열혈강호 3 (0) | 2019.10.13 |
[C++] 백준 11376번 열혈강호 2 (0) | 2019.10.13 |
[C++] 백준 11375번 열혈강호 (0) | 2019.10.13 |