标签:
题意:动物园有n种猫,m种狗,小孩子喜欢猫就讨厌狗,喜欢狗就讨厌猫,只要孩子们不喜欢的东西不在,他们就开心,问他们的最大开心度。
分析:建图是个难点,反正我是不会建的,搜了题解才意识到可以建“矛盾边”这种东西。只要孩子们喜欢的东西有冲突就连边,最后找到最大的独立集就是答案了
/************************************************ Author :DarkTong Created Time :2016/8/1 17:20:09 File Name :Hdu_3829.cpp *************************************************/ #include <bits/stdc++.h> using namespace std; const int maxn = 500 + 10; vector<int> w[maxn]; int n, m; int Left[maxn]; bool used[maxn]; bool match(int i) { for(int j=0;j<w[i].size();++j) if(!used[w[i][j]]) { int v = w[i][j]; used[v] = true; if(!Left[v]||match(Left[v])) { Left[v] = i; return true; } } return false; } //返回最大匹配数 int hungary() { int res=0; memset(Left, 0, sizeof(Left)); for(int i=1;i<=n;++i) { memset(used, 0, sizeof(used)); if(match(i)) res++; } return res; } char peo[maxn][2][5]; int main() { int T, cas=1; int p; while(scanf("%d%d%d", &n, &m, &p)==3) { // memset(w, 0, sizeof(w)); for(int i=0;i<maxn;++i) w[i].clear(); m=n=p; for(int i=1;i<=n;++i) scanf("%s%s", peo[i][0], peo[i][1]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(strcmp(peo[i][1], peo[j][0])==0) w[i].push_back(j), w[j].push_back(i); printf("%d\n", (2*n-hungary())>>1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/DarkTong/p/5727056.html