article thumbnail image
Published 2021. 11. 18. 17:31

문제 설명

문제 링크

http://icpc.me/11376

 

11376번: 열혈강호 2

강호네 회사에는 직원이 N명이 있고, 해야할 일이 M개가 있다. 직원은 1번부터 N번까지 번호가 매겨져 있고, 일은 1번부터 M번까지 번호가 매겨져 있다. 각 직원은 최대 두 개의 일을 할 수 있고,

www.acmicpc.net

풀이

이분 매칭으로 풀 수 있다.

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
복사했습니다!