끄적끄적 코딩
article thumbnail
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

검색 태그