题目大意:
有n只猫,有m只狗。现在有P个学生去参观动物园。每个孩子有喜欢的动物和不喜欢的动物。假如他喜欢猫那么他就一定不喜欢狗(反之亦然)。
如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不喜欢则移除。现在管理员想知道移除哪些动物可以使最大数量的孩子高兴。
输入数据:
输入包含多组测试实例。
第一行是三个数字n, m, p.
接下来p行。
每行 CX, DX 代表他喜欢第X只猫,讨厌第X只狗(反之亦然)
 
题目思路:
构图思路:我们把所有人进行构图,如果两个人之间有矛盾就建立一条边。然后求最大独立集就行了
二分图的最大独立集 : 二分图的最大独立集=图的点数  -  最大匹配数 
可以这样理解,在总的点集中,去掉最少的点,使得剩下的点相互之间没有边。用最少的点去覆盖所有的边,也就是最小覆盖。
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
#define INF 0x3fffffff
#define maxn 505
int n, m, p, P[maxn], color[maxn];///n只猫 m只狗 p个人
bool G[maxn][maxn], vis[maxn];///构图
vector<vector<int> > LikeDog;///喜欢第k只狗的人邻接表
vector<vector<int> > DisDog;///不喜欢这只够的人的集合
vector<vector<int> > LikeCat;///同上
vector<vector<int> > DisCat; void Init()
{
LikeDog.clear();
LikeDog.resize(m+);
LikeCat.clear();
LikeCat.resize(n+); DisDog.clear();
DisDog.resize(m+);
DisCat.clear();
DisCat.resize(n+);
memset(G, false, sizeof(G) );
} void MakeMap()
{
for(int i=; i<=m; i++)
{
int len1 = LikeDog[i].size();
int len2 = DisDog[i].size();
for(int j=; j<len1; j++)
{
int v1 = LikeDog[i][j];
for(int k=; k<len2; k++)
{
int v2 = DisDog[i][k];
G[v1][v2] = true;
G[v2][v1] = true;
}
}
} for(int i=; i<=n; i++)
{
int len1 = LikeCat[i].size();
int len2 = DisCat[i].size();
for(int j=; j<len1; j++)
{
int v1 = LikeCat[i][j];
for(int k=; k<len2; k++)
{
int v2 = DisCat[i][k];
G[v1][v2] = true;
G[v2][v1] = true;
}
}
}
}
bool Find(int u)
{
for(int i=; i<=p; i++)
{
if(!vis[i] && G[u][i])
{
vis[i] = true;
if(P[i] == - || Find(P[i]) )
{
P[i] = u;
return true;
}
}
}
return false;
}
void DFS(int u,int Color)
{
color[u] = Color;
for(int i=; i<=p; i++)
{
if(G[u][i] && !color[i])
{
DFS(i, -Color);
}
}
} int solve()
{
int ans = ;
memset(P, -, sizeof(P));
memset(color, , sizeof(color)); for(int i=; i<=p; i++)
{
if(color[i] == )
DFS(i, );
}
for(int i=; i<=p; i++)
{
memset(vis, false, sizeof(vis));
if(color[i] == && Find(i) )
ans ++;
}
return p - ans;
} int main()
{
while(scanf("%d %d %d ",&n, &m, &p) != EOF)
{
char ch1, ch2;
int a, b;
Init();
for(int i=; i<=p; i++)
{
scanf("%c%d %c%d",&ch1, &a, &ch2, &b);
getchar();
if(ch1 == 'C')
{
LikeCat[a].push_back(i);
DisDog[b].push_back(i);
}
else
{
LikeDog[a].push_back(i);
DisCat[b].push_back(i);
}
}
MakeMap();
printf("%d\n", solve() );
}
return ;
}

HDU 3829 Cat VS Dog(最大独立集)的更多相关文章

  1. HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】

    <题目链接> 题目大意: 动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些动物.假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy. ...

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

    HDU 3829 Cat VS Dog / NBUT 1305 Cat VS Dog(二分图最大匹配) Description The zoo have N cats and M dogs, toda ...

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

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

  4. hdu 3829 Cat VS Dog 二分图匹配 最大点独立集

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Prob ...

  5. HDU 3829 - Cat VS Dog (二分图最大独立集)

    题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动 ...

  6. HDU - 3829 Cat VS Dog (二分图最大独立集)

    题意:P个小朋友,每个人有喜欢的动物和讨厌的动物.留下喜欢的动物并且拿掉讨厌的动物,这个小朋友就会开心.问最多有几个小朋友能开心. 分析:对于每个动物来说,可能既有人喜欢又有人讨厌,那么这样的动物实际 ...

  7. hdu 3829 Cat VS Dog 二分匹配 最大独立点集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题目大意: 给定N个猫,M个狗,P个小朋友,每个小朋友都有喜欢或者不喜欢的某猫或者某狗 管理员从 ...

  8. HDU 3829 Cat VS Dog

    题意: p个人  每一个人有喜欢和讨厌的动物  假设选出的动物中包括这个人喜欢的动物同一时候不包括他讨厌的动物那么这个人会开心  问  最多几个人开心 思路: 二分图最大独立集  利用人与人之间的冲突 ...

  9. hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图

    题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的, ...

随机推荐

  1. Oracle 卸载 不干净

    关闭oracle相关的服务 注册表删除(可能因为oracle及windows的版本不同注册表信息也有些差异): 开始è输入regedit 打开注册表编辑器删除下面的目录 HKEY_LOCAL_MACH ...

  2. ASP.NET Boilerplate 工作单元

    从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...

  3. kafka版本0.8.2.0-Producer Configs之request.required.acks

    This value controls when a produce request is considered completed. Specifically, how many other bro ...

  4. 判断浏览器是否支持FileReader

    1.js代码: //判断浏览器是否支持FileReader if (typeof FileReader == "undefined") { document.write(" ...

  5. (转)修改ECSHOP前后台的title中的ecshop

    前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop 前者在后台商店设置 - 商店标题修改 后者打开includes/lib_main.php $page_t ...

  6. Android端上传图片到后台,存储到数据库中 详细代码

    首先点击头像弹出popwindow,点击相册,相机,调用手机自带的裁剪功能,然后异步任务类访问服务器,上传头像,保存到数据库中, 下面写出popwindow的代码 //设置popwindow publ ...

  7. java中json转xml

    参考:http://heipark.iteye.com/blog/1394844 需要json-lib-2.1-jdk15.jar和xom-1.2.5.jar,maven pom.xml如下: xml ...

  8. Business Intelligence (BI)

    BI, 全称Business Inteligence. 帮助企业更有效地利用数据,提供经营决策支持.让决策管理者随时随地获取关键信息,基于数字决策,最终提高决策水平. 包括范围(层次由低到高):数据报 ...

  9. 启动scala的方法

    1.从官网 http://www.scala-lang.org/download/ 下载scala二进制通用版本以后,在终端命令行添加下载解压包的bin目录到环境变量: export PATH=/Us ...

  10. 【POJ2912】【并查集】Rochambeau

    Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is th ...