문제 링크
풀이
이분 매칭 연습문제다.
백준 2188 축사배정을 풀었다면 날먹문제다. 배열 크기만 바꿔서 제출하면 맞을 수 있다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1003;
vector<int> v[N];
bool visited[N]; // 왼쪽 집합의 i를 방문했는지 여부
int r[N]; // 오른쪽 집합의 i가 연결된 놈
bool dfs(int a) {
visited[a] = true;
for (auto b : v[a]) {
// b가 연결된게 없거나, b에 이미 연결된 놈을 방문 안했고, dfs로 들어가면 이미 연결된놈을 방문처리 해서 건너뛰고 다른놈에 연결
if (r[b] == -1 || !visited[r[b]] && dfs(r[b])) {
r[b] = a;
return true;
}
}
return false;
}
int main() {
cin.tie(0) -> sync_with_stdio(0);
int n, m; cin >> n >> m;
for (int i = 0; i < n; i++) {
int s; cin >> s;
v[i].resize(s);
for (auto &k : v[i]) cin >> k;
}
fill(r, r + N, -1);
int ret = 0;
for (int i = 0; i < n; i++) {
fill(visited, visited + N, false);
if (dfs(i)) ret++;
}
cout << ret;
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[19581] 두 번째 트리의 지름 (2) | 2021.11.15 |
---|---|
백준[16978] 수열과 쿼리 22 (0) | 2021.11.13 |
백준[2188] 축사 배정 (0) | 2021.11.13 |
백준[2296] 건물짓기 (0) | 2021.11.13 |
백준[1011] Fly me to the Alpha Centauri (0) | 2021.11.12 |