首页 > 代码库 > UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)
UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)
UVA 12168 - Cat vs. Dog
题目链接
题意:给定一些猫爱好者,和一些狗爱好者,每个人都有一个喜欢的猫(狗),和一个讨厌的狗(猫),要问现在给一种方案,使得尽量多的人被满足
思路:二分图匹配最大独立集,猫爱好者和狗爱好者矛盾的建边,做一次最大独立集即可
代码:
#include <cstdio> #include <cstring> #include <vector> using namespace std; const int N = 505; int t, c, d, n; struct People { int a, b; People() {} People(int a, int b) { this->a = a; this->b = b; } } cat[N], dog[N]; int cn, dn; vector<int> g[N]; char A[105], B[105]; int match[N], vis[N]; bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; if (match[v] == -1 || dfs(match[v])) { match[v] = u; return true; } } return false; } int hungary() { int ans = 0; memset(match, -1, sizeof(match)); for (int i = 0; i < cn; i++) { memset(vis, 0, sizeof(vis)); if (dfs(i)) ans++; } return ans; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &c, &d, &n); for (int i = 0; i < n; i++) g[i].clear(); cn = 0; dn = 0; for (int i = 0; i < n; i++) { scanf("%s%s", A, B); int aa, bb; sscanf(A + 1, "%d", &aa); sscanf(B + 1, "%d", &bb); if (A[0] == 'C') cat[cn++] = People(aa, bb); else dog[dn++] = People(aa, bb); } for (int i = 0; i < cn; i++) for (int j = 0; j < dn; j++) { if (cat[i].b == dog[j].a || cat[i].a == dog[j].b) g[i].push_back(j); } printf("%d\n", n - hungary()); } return 0; }
UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。