문제: icpc.me/3683
투표하는 시청자 v명중에서 고양이를 좋아하는 사람과 개를 좋아하는 사람으로 구분시켜 놓은 뒤
의견이 충돌하는 사람끼리 간선을 이어주면 이분그래프가 완성된다.
문제에서 물어보는건 의견충돌이 최소한이 되야하므로 이분 그래프에서의 min cut을 구해주면 된다. 답은 v-min cut이 된다.
이분매칭에서 mincut문제는 이분매칭으로 해결할 수 있다.
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 52 53 54 55 56 | #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <string> #include <iostream> using namespace std; int t, c, d, v, visited[501], b[501]; vector<vector<int>> vt; pair<string, string> per[501]; string x, y; int dfs(int here) { if (visited[here]) return false; visited[here] = true; for (auto next : vt[here]) { if (!b[next] || dfs(b[next])) { b[next] = here; return true; } } return false; } int bmatch() { memset(b, 0, sizeof(b)); int ret = 0; for (int i = 1; i <= v; i++) { memset(visited, 0, sizeof(visited)); if (dfs(i))ret++; } return v - ret; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &c, &d, &v); vt.clear(); vt.resize(v + 1); for (int i = 1; i <= v; i++) { cin >> x >> y; per[i] = { x,y }; } for (int i = 1; i <= v; i++) { for (int j = i + 1; j <= v; j++) { if (per[i].first == per[j].second || per[i].second == per[j].first) { if (per[i].first[0] == 'C') vt[i].push_back(j); else vt[j].push_back(i); } } } printf("%d\n", bmatch()); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)13308 주유소 (0) | 2017.05.04 |
---|---|
BOJ)9460 메탈 (0) | 2017.04.29 |
BOJ)2610 회의준비 (0) | 2017.04.24 |
BOJ)5913 준규와 사과 (0) | 2017.04.21 |
BOJ)3109 빵집 (0) | 2017.04.21 |