HDU 3829 Cat VS Dog / NBUT 1305 Cat VS Dog(二分图最大匹配)

Description

The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the child's like-animal is a cat, then his/hers dislike-animal must be a dog, and vice versa.

Now the zoo administrator is removing some animals, if one child's like-animal is not removed and his/hers dislike-animal is removed, he/she will be happy. So the administrator wants to know which animals he should remove to make maximum number of happy children.

Input

The input file contains multiple test cases, for each case, the first line contains three integers N <= 100, M <= 100 and P <= 500.

Next P lines, each line contains a child's like-animal and dislike-animal, C for cat and D for dog. (See sample for details)

Output

For each case, output a single integer: the maximum number of happy children.

Sample Input

1 1 2

C1 D1

D1 C1

1 2 4

C1 D1

C1 D1

C1 D2

D2 C1

Sample Output

1

3

Http

HDU:https://vjudge.net/problem/HDU-3829

NBUT:https://vjudge.net/problem/NBUT-1305

Source

二分图最大匹配

题目大意

在动物园中有n只猫和m只狗,现在来了P个小朋友,每个小朋友喜欢一只动物,不喜欢另一只动物,现在要选择移走若干只动物,若能满足喜欢的动物在而不喜欢的动物被移走,则该小朋友是开心的。现在求最多能使多少位小朋友开心。

解决思路

二分图的最大匹配问题,这里用匈牙利算法解决,算法内容可以参照我的这几篇博客:

http://www.cnblogs.com/SYCstudio/p/7138221.html

http://www.cnblogs.com/SYCstudio/p/7138230.html

那么笔者在本文就讲一讲将匈牙利算法运用在本题时,如何建图。

首先我们观察到,如果建图小朋友->动物无疑会增加算法的思考难度(反正笔者是没有想出来怎么做),那么我们就把每个小朋友i拆成两个点,开心的小朋友i和不开心的小朋友i',如果发现两个小朋友的动物需求有冲突(即i喜欢的是j不喜欢的,或i不喜欢的是j喜欢的),那么连边这两个小朋友i->j',j->i'(怎么有种回到了2-sat问题的感觉,但这和2-sat毫无关系)。然后对这个图跑一边匈牙利。

那么这时得到的最大匹配就是题目中要求的东西吗?显然不是。首先因为我们把一个点拆成了两个,这个答案要除以2;其次我们建的图是不开心的图,而题目要求的是开心的小朋友的数量,所以要用总人数P来减去除以2后的答案。这样我们就得到最终的解啦!

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int maxN=200;
const int maxP=1001;
const int inf=2147483647; class Child
{
public:
int like,dislike;
}; int n,m,P;
Child C[maxP];
vector<int> E[maxP];
int Match[maxP];
bool vis[maxP]; bool Hungary(int u); int main()
{
while (cin>>n>>m>>P)
{
memset(Match,-1,sizeof(Match));
for (int i=1;i<=P;i++)
E[i].clear();
for (int i=1;i<=P;i++)//这里把猫和狗的编号处理了一下,猫的编号为1~n,狗的编号为n+1~n+m
{
char ch;
cin>>ch;
int k=(ch=='C') ? 0 : 1;
int x;
cin>>x;
C[i].like=x+n*k;
cin>>ch;
k=(ch=='C') ? 0 : 1;
cin>>x;
C[i].dislike=x+n*k;
} for (int i=1;i<=P;i++)//看看哪几对小朋友会冲突,建图
for (int j=i+1;j<=P;j++)
if ((C[i].like==C[j].dislike)||(C[i].dislike==C[j].like))
{
E[i].push_back(j);
E[j].push_back(i);
} int Ans=0;
for (int i=1;i<=P;i++)//匈牙利算法
{
memset(vis,0,sizeof(vis));
if (Hungary(i))
Ans++;
}
cout<<P-Ans/2<<endl;
}
} bool Hungary(int u)//匈牙利算法
{
for (int i=0;i<E[u].size();i++)
{
int v=E[u][i];
if (vis[v]==0)
{
vis[v]=1;
if ((Match[v]==-1)||(Hungary(Match[v])))
{
Match[v]=u;
return 1;
}
}
}
return 0;
}

HDU 3829 Cat VS Dog / NBUT 1305 Cat VS Dog(二分图最大匹配)的更多相关文章

  1. HDU 3829——Cat VS Dog——————【最大独立集】

    Cat VS Dog Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  2. HDU 3829

    http://acm.hdu.edu.cn/showproblem.php?pid=2970 P个小朋友喜欢猫讨厌狗,喜欢狗讨厌猫,移除一定数量的猫狗,使开心的小朋友数量最多 二分图最大独立集=顶点数 ...

  3. HDU:过山车(二分图最大匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意:有m个男,n个女,和 k 条边,求有多少对男女可以搭配. 思路:裸的二分图最大匹配,匈牙利算法. 枚 ...

  4. [HDU] 2063 过山车(二分图最大匹配)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 女生为X集合,男生为Y集合,求二分图最大匹配数即可. #include<cstdio> ...

  5. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  6. HDU 2063 过山车(模板—— 二分图最大匹配问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2063  解题思路: 二分图最大匹配模板题. AC代码: #include<stdio.h> ...

  7. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  8. # 匈牙利算法(二分图最大匹配)- hdu 过山车

    匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...

  9. HDU 2444 The Accomodation of Students【二分图最大匹配问题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:首先判断所有的人可不可以分成互不认识的两部分.如果可以分成 ,则求两部分最多相互认识的对数. ...

随机推荐

  1. android学习-第一讲

    一.基础View控件 View类的常见XML属性,对应发放及说明 每个界面控件都需要设置Android:layout_height,Android:layout_width,指定控件的高度和宽度.通常 ...

  2. GitBook 使用

    介绍 GitBook是一个基于Node.js的命令行工具,可使用 Github/Git和Markdown来制作精美的电子书,GitBook 并非关 Git的教程. 导出格式有PDF.HTML等,需要添 ...

  3. 【2017-06-01】Linq基础+Lambda表达式实现对数据库的增删改查

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net.省去了自己敲代码的实体类和数据访问类的大量工作. 实体类: 添加一个Linq to sql 类 -- ...

  4. Selenium基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-selenium/ 什么是Selenium Selenium是一个自动化测试工具 是一组不同的 ...

  5. Linux命令不熟悉(记录)

    1.回到上一次操作的目录 cd - 2.rz打开上传文件 rz 3.下载某个文件 wget httpdownload 4.根据名字查找文件 find / -name mysql 5.通配符删除 rm ...

  6. Spring 依赖注入之从不会到稍微会一点儿

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. CoreAnimation学习,学习总结,记录各种过程中遇到的坑

    1. CAAimation  的 duration = 0 的时候, 这个时候就相当于没有动画了. 2. CAKeyframeAnimation *rotateAnimation = [CAKeyfr ...

  8. 浅谈java内存分配和回收策略

    一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...

  9. 常用SHELL命令

    1.查看版本号cat /proc/version; uname -a; uname -r 2.查看用户组cat /etc/group 3.查看当前用户组 groups 4.查看当前用户 whoami ...

  10. 第2章 系统用户/组管理(2) su和sudo

    本文目录: 2.1 su 2.2 sudo 2.2.1 /etc/sudoers文件 2.2.2 sudo和sudoedit命令 2.1 su 切换用户或以指定用户运行命令. 使用su可以指定运行命令 ...