문제: icpc.me/11376
사람 N명과 할일 M명이 있을 때 각 사람이 최대 두개일을 할 수 있을 때의 최대매칭을 구하면 되는 문제이다.
우리는 각 사람에 대해서 이분 매칭을 2번씩 돌려주어 최대매칭을 구해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #define MAX_N 1000 using namespace std; vector<vector<int>> vt; int b[MAX_N + 1], visited[MAX_N + 1], n, m, x; bool dfs(int here) { if (visited[here])return false; visited[here] = true; for (auto there : vt[here]) { if (!b[there] || dfs(b[there])) { b[there] = here; return true; } } return false; } int bmatch() { int ret = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j < 2; j++) { memset(visited, 0, sizeof(visited)); if (dfs(i))ret++; } } return ret; } int main() { scanf("%d%d", &n, &m); vt.resize(n + 1); for (int i = 1; i <= n; i++) { int c; scanf("%d", &c); while (c--) { scanf("%d", &x); vt[i].push_back(x); } } scanf("%d", &m); printf("%d\n", bmatch()); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)1867 돌멩이 제거 (0) | 2017.02.16 |
---|---|
BOJ)11377 열혈강호3 (0) | 2017.02.16 |
BOJ)10090 Counting Inversions (0) | 2017.02.15 |
BOJ)2262 토너먼트 만들기 (0) | 2017.02.15 |
BOJ)14226 이모티콘 (0) | 2017.02.14 |