PS/BOJ
백준 2188번: 축사 배정 (C++)
도비(Doby)
2022. 3. 19. 22:51
https://www.acmicpc.net/problem/2188
2188번: 축사 배정
농부 존은 소 축사를 완성하였다. 축사 환경을 쾌적하게 유지하기 위해서, 존은 축사를 M개의 칸으로 구분하고, 한 칸에는 최대 한 마리의 소만 들어가게 계획했다. 첫 주에는 소를 임의 배정해
www.acmicpc.net
Solved By: Bipartite Matching
전형적인 이분 매칭 이론 문제였습니다.
+ 이번 문제를 계기로 Bipartite Matching, O(VE)를 스스로 구현할 수 있게 되었습니다.
#include <iostream>
#include <vector>
#include <memory.h>
#define MAX 201
using namespace std;
vector<int> adj[MAX];
bool visited[MAX];
int occupy[MAX];
int n, m;
bool biMatch(int node){
for(int i = 0; i < adj[node].size(); i++){
int next = adj[node][i];
if(visited[next]) continue;
visited[next] = true;
if(occupy[next] == 0 || biMatch(occupy[next])){
occupy[next] = node;
return true;
}
}
return false;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
int v; cin >> v;
for(int j = 0; j < v; j++){
int a; cin >> a;
adj[i].push_back(a);
}
}
int result = 0;
for(int i = 1; i <= n; i++){
memset(visited, false, sizeof(visited));
if(biMatch(i)) result++;
}
cout << result;
return 0;
}