[๋ฐฑ์ค€] 11377๋ฒˆ: ์—ดํ˜ˆ๊ฐ•ํ˜ธ 3

2021. 1. 10. 10:08ใ†๐Ÿ‘จ๐Ÿป‍๐Ÿซ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/BOJ(๋ฐฑ์ค€)


๋ฌธ์ œ๋งํฌ : [๋ฐฑ์ค€] 11377๋ฒˆ: ์—ดํ˜ˆ๊ฐ•ํ˜ธ 3

 

11377๋ฒˆ: ์—ดํ˜ˆ๊ฐ•ํ˜ธ 3

์ฒซ์งธ ์ค„์— ์ง์›์˜ ์ˆ˜ N๊ณผ ์ผ์˜ ๊ฐœ์ˆ˜ M, ์ผ์„ 2๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ง์›์˜ ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N, M ≤ 1,000, 1 ≤ K ≤ N) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์˜ i๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ ์ง์›์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์˜ ๊ฐœ์ˆ˜์™€ ํ•  ์ˆ˜ ์žˆ

www.acmicpc.net

1. ๋ฌธ์ œ

๊ฐ•ํ˜ธ๋„ค ํšŒ์‚ฌ์—๋Š” ์ง์›์ด N๋ช…์ด ์žˆ๊ณ , ํ•ด์•ผํ•  ์ผ์ด M๊ฐœ๊ฐ€ ์žˆ๋‹ค. ์ง์›์€ 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , ์ผ์€ 1๋ฒˆ๋ถ€ํ„ฐ M๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

๊ฐ ์ง์›์€ ํ•œ ๊ฐœ์˜ ์ผ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ์€ 1๋ช…์ด์–ด์•ผ ํ•œ๋‹ค. ๋‹จ, N๋ช… ์ค‘์—์„œ K๋ช…์€ ์ผ์„ ์ตœ๋Œ€ 2๊ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ์ง์›์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์˜ ๋ชฉ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, M๊ฐœ์˜ ์ผ ์ค‘์—์„œ ์ตœ๋Œ€ ๋ช‡ ๊ฐœ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


2. ์ž…์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ง์›์˜ ์ˆ˜ N๊ณผ ์ผ์˜ ๊ฐœ์ˆ˜ M, ์ผ์„ 2๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ง์›์˜ ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N, M ≤ 1,000, 1 ≤ K ≤ N)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์˜ i๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ ์ง์›์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์˜ ๊ฐœ์ˆ˜์™€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ฒซ์งธ ์ค„์— ๊ฐ•ํ˜ธ๋„ค ํšŒ์‚ฌ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


3. ๋ฌธ์ œ ํ’€์ด ๋ฐ ์ฝ”๋“œ

์ง์› , ํ•ด์•ผํ•  ์ผ ์ด ๋‘๊ฐ€์ง€ ์ง‘๋‹จ๊ฐ„์˜ ์ตœ๋Œ€ ๋งค์นญ์„ ์ฐพ์•„์•ผํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ง์› ์ง‘๋‹จ๊ณผ ํ•ด์•ผํ•  ์ผ ์ง‘๋‹จ์€ ๊ทธ ๊ฐ๊ฐ์˜ ์ง‘๋‹จ ์š”์†Œ ๋ผ๋ฆฌ๋Š” ๊ฐ„์„ ์ด ์—†๊ณ  ์ง์› ์ง‘๋‹จ๊ณผ ์ผ ์ง‘๋‹จ ์‚ฌ์ด์—๋งŒ ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๋กœ ์—ฌ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์˜ ์šฉ๋Ÿ‰์ด ๋ชจ๋‘ 1์ธ ์ตœ๋Œ€ ๋งค์นญ์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ์ด๋ถ„ ๋งค์นญ์„ DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. 

#include<bits/stdc++.h>
using namespace std;
const int MAX = 1000 + 1;
int workers[MAX],tasks[MAX],N,M,K;
bool visited[MAX];
vector<vector<int>> canDo;

bool dfs(int a){
	if(visited[a]) return false;
	visited[a] = true;
	for(int i=0;i<(int)canDo[a].size();i++) {// worker a๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ ํƒ์ƒ‰.
		int b = canDo[a][i];
		if(!tasks[b]||dfs(tasks[b])) {
			tasks[b] = a;
			workers[a] = b;
			return true;
		}
	}
	return false;
}

int biMatching(){						
	int ans = 0;
	for(int i=1;i<=N;i++){	// ์ตœ๋Œ€ ๋งค์นญ ํ•œ ๋ฒˆ ์ง„ํ–‰.
		memset(visited,0,sizeof(visited));
		if(dfs(i)) ans++;
	}
    
	
	for(int i=1;i<=N;i++){	// ๋งค์นญ์ด ๋๋‚˜๊ณ  ์ผ์„ 2๋ฒˆ ํ•  ์ˆ˜์žˆ๋Š” K๋ช…์˜ ์ง์›๊ณผ ์ผ์„ ๋งค์นญ.
		memset(visited,0,sizeof(visited));
		if(dfs(i)){ 
			ans++; 
			K--;
			if(!K) break;
		}
	}
	return ans;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin>>N>>M>>K;
	canDo.resize(N+1);
	for(int i=1;i<=N;i++) {
		int cnt;
		cin>>cnt;
		while(cnt--){
			int taskNum;
			cin>>taskNum;
			canDo[i].push_back(taskNum); // i๋ฒˆ์งธ ์ง์›์ด ํ•  ์ˆ˜ ์žˆ๋Š”์ผ ์ €์žฅ.
		}
	}
	cout<<biMatching()<<"\n";	

	return 0;
}


4. ๋งˆ๋ฌด๋ฆฌ

์ด๋ถ„ ๋งค์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค! ๋ถ€์กฑํ•œ ๋ถ€๋ถ„ ์ง€์  ์–ธ์ œ๋“  ๋Œ“๊ธ€๋กœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค^^.