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

 

11376번: 열혈강호 2

강호네 회사에는 직원이 N명이 있고, 해야할 일이 M개가 있다. 직원은 1번부터 N번까지 번호가 매겨져 있고, 일은 1번부터 M번까지 번호가 매겨져 있다. 각 직원은 최대 두 개의 일을 할 수 있고, 각각의 일을 담당하는 사람은 1명이어야 한다. 각각의 직원이 할 수 있는 일의 목록이 주어졌을 때, M개의 일 중에서 최대 몇 개를 할 수 있는지 구하는 프로그램을 작성하시오.

www.acmicpc.net


문제해설

열혈강호 1 에서 바뀐 조건은 한사람이 2가지의 일을 할 수 있다는 것이다.

visit을 초기화 하고나서,

2번의 flow를 발생시키면 된다.


전체코드

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define endl '\n'
//--------------------------------------------------------------------------------------

#define MAX_N 1001
vector<int> map[MAX_N];

int employee[MAX_N];
int work[MAX_N];
bool visit[MAX_N];

bool fun(int s) {
	visit[s] = true;
	for (int i = 0; i < map[s].size(); i++) {
		if (work[map[s][i]] == -1 || (!visit[work[map[s][i]]] && fun(work[map[s][i]]))) {
			employee[s] = map[s][i];
			work[map[s][i]] = s;
			return true;
		}
	}
	return false;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int N, M; cin >> N >> M;

	for (int i = 1; i <= N; i++) {
		int s; cin >> s;
		for (int j = 0; j < s; j++) {
			int data; cin >> data;
			map[i].push_back(data);
		}
	}
	memset(employee, -1, sizeof(employee));
	memset(work, -1, sizeof(work));
	int ans = 0;
	for (int i = 1; i <= N; i++) {
		if (employee[i] == -1) {
			memset(visit, false, sizeof(visit));
			if (fun(i)) ans++;
			if (fun(i)) ans++;
		}
	}
	cout << ans << endl;
}

 


기타

 

'알고리즘 > [C++]BOJ' 카테고리의 다른 글

[백준BOJ] 6086 최대 유량  (0) 2019.10.13
[백준BOJ] 11375 열혈강호  (0) 2019.10.13
[백준BOJ] 2188 축사 배정  (0) 2019.10.13

+ Recent posts