끄적끄적 코딩
article thumbnail

이분매칭으로 문제를 해결했습니다.

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

검색 태그