본문 바로가기

ALGORITHM/DFS, BFS

11578 팀원 모집

https://www.acmicpc.net/problem/11578

 

11578번: 팀원 모집

3번 학생과 4번 학생을 선택하면 1번부터 5번까지 모든 문제를 풀 수 있는 팀을 만들 수 있다. 1번, 2번, 4번 학생을 선택해도 모든 문제를 다 풀 수 있지만 팀원의 수가 3명이라 답이 될 수 없다.

www.acmicpc.net

백트래킹은 아니고 브루트 포스 문제 같다.

전체 경우의 수를 다 해봐야 하니 DFS로 전체 탐색

 

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

#define initialize(x, y) memset(x, y, sizeof(x));

int N, M, cnt, min_cnt;
int std_solve[11][11];
int solve[11];
bool flag;

bool isSolve() {
	for (int i = 1; i <= N; i++) {
		if (solve[i] == 0) {
			return false;
		}
	}
	return true;
}

void dfs(int u) {
	cnt++;
	for (int i = 1; i <= N; i++) {
		if (std_solve[u][i] == 1) {
			solve[i]++;
		}
	}

	if (isSolve()) {
		flag = true;
		if (cnt < min_cnt) {
			min_cnt = cnt;
		}
	}
	else {
		for (int i = u + 1; i <= M; i++) {
			dfs(i);
		}
	}

	cnt--;
	for (int i = 1; i <= N; i++) {
		if (std_solve[u][i] == 1) {
			solve[i]--;
		}
	}
}

int main() {
	int O, input;
	min_cnt = 100;
	cin >> N >> M;
	for (int i = 1; i <= M; i++) {
		cin >> O;
		for (int j = 1; j <= O; j++) {
			cin >> input;
			std_solve[i][input] = 1;
		}
	}

	for (int i = 1; i <= N; i++) {
		cnt = 0;
		dfs(i);
	}

	if (flag) {
		cout << min_cnt;
	}
	else {
		cout << -1;
	}
}

어떻게 풀어야 할지 감이 안 잡혀서 검색의 힘을 빌려버렸다..

많이 풀면 바로바로 풀 수 있겠지 *_*

점점 DFS의 신세계에 빠지는 중..

'ALGORITHM > DFS, BFS' 카테고리의 다른 글

14889 스타트와 링크  (0) 2021.01.16
9663 N-Queen  (0) 2021.01.16
15649 N과 M (1)  (0) 2021.01.12
17267 상남자  (1) 2021.01.07
11581 구호물자  (3) 2020.12.25