hdu3829 二分匹配 最大独立集
Cat VS Dog
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
Problem 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
Hint
Case 2: Remove D1 and D2, that makes child 1, 2, 3 happy.
题意:有p个孩子参观动物园,动物园里面有n只猫和m只狗,每个孩子喜欢猫讨厌狗,或者喜欢狗讨厌猫。当把一个孩子不喜欢的动物移走,喜欢的动物留下,这个孩子才会高兴。 问最多能使多少个孩子高兴。
解题思路:题目有一个关键点,孩子喜欢猫,必然不喜欢狗,反之。 即猫和猫之间,狗和狗之间一定不存在矛盾关系,符合二分图的概念。
需要求满足条件的最大独立集,而最大独立集=节点总个数-最小覆盖集,最小覆盖集=最大匹配,所以最大独立集=节点总个数-最大匹配。问题转化为了求最大匹配。
建图:
以孩子作为节点,如果A小孩喜欢的动物与B小孩讨厌的动物一样,或者A小孩讨厌的动物与B小孩喜欢的动物一样,那AB之间就存在着排斥关系,则他们之间连接一条边。 然后求出最多有多少对孩子之间产生矛盾,用这个结果除以2就是最大匹配数。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N =555;
vector<int> vec[N]; //代表不同的孩子
char like[N][11],dis[N][111];
int result[N],vis[N];
bool find(int a)
{
int i;
for(i=0;i<vec[a].size();i++)
{
int u=vec[a][i];
if(!vis[u])
{
vis[u]=1;
if(!result[u]||find(result[u])) //如果i未在前一个匹配中或者从其相邻的节点出发可以有增广路
{
{
result[u]=a;
return true;
}
}
}
return false;
}
int main()
{
int i,j,n,m,p;
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(vec,0,sizeof(vec));
memset(result,0,sizeof(result));
for(i=0;i<p;i++)
{
scanf("%s%s",like[i],dis[i]);
}
for(i=0;i<p;i++)
{
for(j=i+1;j<p;j++)
{
if(!strcmp(like[i],dis[j])||!strcmp(dis[i],like[j]))
{
vec[i].push_back(j); //i与j产生矛盾,则在i与j之间建立路径
vec[j].push_back(i);
}
}
}
int ans=0;
for(i=0;i<p;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
printf("%d\n",p-ans/2);
}
return 0;
}
hdu3829 二分匹配 最大独立集的更多相关文章
- HDU - 1068 Girls and Boys(二分匹配---最大独立集)
题意:给出每个学生的标号及与其有缘分成为情侣的人的标号,求一个最大集合,集合中任意两个人都没有缘分成为情侣. 分析: 1.若两人有缘分,则可以连一条边,本题是求一个最大集合,集合中任意两点都不相连,即 ...
- hdu 4169 二分匹配最大独立集 ***
题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 #inclu ...
- Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集
m种阳离子 n种阴离子 然后一个m*n的矩阵 第i行第j列为1代表第i种阴离子和第j种阴离子相互吸引 0表示排斥 求在阳离子和阴离子都至少有一种的情况下 最多存在多少种离子能够共存 阴阳离子都至少须要 ...
- POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题
有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开 ...
- HDU 1068 Girls and Boys 二分图最大独立集(最大二分匹配)
Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- POJ 1466 大学谈恋爱 二分匹配变形 最大独立集
Girls and Boys Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 11694 Accepted: 5230 D ...
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...
- nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...
- HDU 4619 Warm up 2(2013多校2 1009 二分匹配)
Warm up 2 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
随机推荐
- C# 时间格式转换
DateTime dd =DateTime.Parse(temp[0]); string aa = dd.ToShortDateString();
- Java多线程和并发(十二),Java线程池
目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...
- HGOI20190813 省常中互测6
Problem A 蛋糕 将$n \times m $大小的蛋糕切成每块为$1 \times 1$大小的$n\times m$块. 交换任意两块蛋糕的切割顺序的方案算作一种. 对于$100 \%$的数 ...
- 微信小程序_(map)简单的小地图
map地图效果 官方文档:传送门 Page({ data: { markers: [{ iconPath: "/resources/others.png", id: 0, lati ...
- Linux-expect脚本-1
expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 首行加上/usr/bin/expect spawn: 后面加上需要执行的shell命令,比如说spawn sudo ...
- python 随机数详细使用,推到以及字符串,双色球小程序
#随机数的使用import random #导入randomrandom.randint(0,9)#制定随机数0到9i=random.sample(range(1,34),6)#输出6个随机数,范围是 ...
- [CSP-S模拟测试]:城市游戏(图论+DP)
题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...
- C++入门经典-例2.9-输出十六进制数以及大写的十六进制数
1:代码如下: #include "stdafx.h" #include <iostream> #include <iomanip> using names ...
- ES6 字符串的扩展(待细读)
1.确定字符串中是否含有某个字符串 indexof(value,num):可返回某个指定的字符串值在字符串中首次出现的位置.ES5方法,num范围(0~length-1) includes(value ...
- ListView的MyBaseAdapter的封装
import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import j ...