문제 링크
풀이
이분 매칭으로 풀 수 있다.
2명과 연결을 하기 위해서 dfs함수를 두 번 호출시키면 된다.
코드
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1003;
vector<int> v[N];
bool visited[N];
int B[N];
bool dfs(int a) {
visited[a] = true;
for (auto b : v[a]) {
if (B[b] == -1 || !visited[B[b]] && dfs(B[b])) {
B[b] = a;
return true;
}
}
return false;
}
int main() {
int n, m; scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
int k; scanf("%d", &k);
v[i].resize(k);
for (auto &ipt : v[i]) scanf("%d", &ipt);
}
memset(B, -1, sizeof B);
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 2; j++) {
memset(visited, false, sizeof visited);
if (dfs(i)) ans++;
}
}
printf("%d", ans);
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[15678] 연세워터파크 (0) | 2021.11.23 |
---|---|
백준[1671] 상어의 저녁식사 (0) | 2021.11.18 |
백준[1017] 소수 쌍 (0) | 2021.11.17 |
백준[2243] 사탕상자 (0) | 2021.11.17 |
백준[16927] 배열 돌리기 2 (0) | 2021.11.16 |