hdu3829-Cat VS Dog(最大独立集,匹配问题)
2017-11-15 13:29
246 查看
题目来源:http:///showproblem.?pid=3829
题意
动物园里,有好多小狗小猫,有那么一群孩子,他们分别有喜欢的动物和不喜欢的动物(必须种类不一样。),然后动物园要送走一些动物,那么如果送走了孩子不喜欢的动物,孩子会很开心,问最多能使得多少个孩子开心。。。思路
哇,一看这题就蒙了。。(太菜太菜)这道题其实是求最大独立集。怎么理解呢
两个孩子之间如果喜欢和不喜欢的刚好一样,哇,那么就产生了矛盾,那么反之,就可以不矛盾,如果我们把有矛盾的孩子赋予一定的关系,这个时候我题目就转化成了求没有关系的孩子们的最大集合,也就是最大独立集。。
由于依旧是对全图进行最大匹配,所以最大匹配结果要除以2,那么最大独立集合=节点个数-最大匹配。
代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=500+10; int mp[maxn][maxn],pre[maxn],vis[maxn]; char like[maxn][10],dislike[maxn][10]; int n,m,k; void init() { memset(like,0x00,sizeof(like)); memset(dislike,0x00,sizeof(dislike)); for(int i=1; i<=k; i++) scanf("%s%s",like[i],dislike[i]); } void deal() { memset(mp,0,sizeof(mp)); for(int i=1; i<=k; i++) { for(int j=i+1; j<=k; j++) { if(strcmp(like[i],dislike[j])==0||strcmp(like[j],dislike[i])==0) { mp[i][j]=1; mp[j][i]=1; } } } } int dfs(int i) { for(int j=1; j<=k; j++) { if(mp[i][j]&&!vis[j]) { vis[j]=1; if(pre[j]==-1||dfs(pre[j])) { pre[j]=i; return 1; } } } return 0; } void solve() { int ret=0; memset(pre,-1,sizeof(pre)); for(int i=1; i<=k; i++) { memset(vis,0,sizeof(vis)); ret+=dfs(i); } printf("%d\n",k-ret/2); } int main() { while(~scanf("%d%d%d",&n,&m,&k)) { init(); deal(); solve(); } }
相关文章推荐
- [kuangbin带你飞]专题十 匹配问题 L - Cat VS Dog (二分图最大独立集)
- HDU3829 Cat VS Dog(最大独立集)
- hdu Cat vs. Dog (最大匹配 ——最大独立集)
- HDU3829 Cat VS Dog(二分图最大独立集)
- hdu3829 Cat VS Dog(二分最大独立集)
- HDU3829Cat VS Dog(二分图最大独立集)
- HDU 3829 Cat VS Dog 最大独立集(最大匹配)
- Cat VS Dog---hdu3829(最大独立集)
- hdu 3829 Cat VS Dog (二分匹配 求 最大独立集)
- HDU 3829 Cat VS Dog(最大独立集|二分图最大匹配)
- uva 12168 - Cat vs. Dog (最大匹配 ——最大独立集)
- HDU 2768 Cat vs. Dog 【二分匹配之最大独立集】
- HDU 3829 - Cat VS Dog【二分图最大匹配最大独立集】
- hdu 2768 Cat vs. Dog 最大独立集(最大匹配)
- Cat VS Dog 求二分图最大独立集
- (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)
- HDU 3829 Cat VS Dog(最大独立集)
- Hdu3829 Cat VS Dog(最大独立点集)
- hdu 2768 Cat vs. Dog (最大独立集)
- HDU-3829 Cat VS Dog(最大独立集及对题目的分析)