문제: icpc.me/12843
n개의 강의가 주어질 때 서로 다른 학부의 강의면서 강의의 내용이 겹치는 강의는 두 강의중 하나만 수강할 때 최대로 수강할 강의 수를 구하는 문제이다.
내용이 겹치는 두 강의를 서로 연결해준다면 c학부와 s학부로 이루어진 이분 그래프가 나타나게 된다.
이때 이분 그래프에서 최대로 매칭되는 만큼 수업을 더 안들으면 되기 때문에 이분 매칭을 구해준 후 N에서 빼주면 답이 된다.
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 45 46 47 48 49 50 51 | #include <cstdio> #include <algorithm> #include <vector> #include <cstring> using namespace std; int n, m, x, y; char a; vector<vector<int>> vt; int check[2010]; int backmatch[2010]; bool c[2010]; bool dfs(int here) { if (here == -1)return true; for (int next : vt[here]) { if (check[next])continue; check[next] = true; if (dfs(backmatch[next])) { backmatch[next] = here; return true; } } return false; } int bmatch() { memset(backmatch, -1, sizeof(backmatch)); int ret = 0; for (int i = 1; i <= n; i++) { memset(check, 0, sizeof(check)); if (dfs(i)) ret++; } return ret; } int main() { scanf("%d%d", &n, &m); vt.resize(n + 1); for (int i = 0; i < n; i++) { scanf("%d %c", &x, &a); if (a == 'c') c[x] = true; } for (int i = 0; i < m; i++) { scanf("%d%d", &x, &y); if (c[x]) vt[x].push_back(y); else vt[y].push_back(x); } printf("%d\n", n - bmatch()); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)12842 튀김 소보루 (0) | 2017.01.05 |
---|---|
BOJ)13505 두수 XOR (4) | 2017.01.05 |
BOJ)12841 정보대 등산 (0) | 2017.01.05 |
BOJ)1865 웜홀 (1) | 2017.01.05 |
BOJ)11999 Milk Pails (2) | 2017.01.05 |