article thumbnail image
Published 2021. 11. 13. 20:36

문제 설명

문제 링크

http://icpc.me/11375

 

11375번: 열혈강호

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

www.acmicpc.net

풀이

이분 매칭 연습문제다.

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