<题目链接>

题目大意:

动物园有n条狗。m头猫。p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物。如今动物园要转移一些动物。假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy。问动物最多能使几个小孩happy。

解题分析:

因为本题不同的小孩之间喜好可能会产生冲突,所以,要使最多的小孩满意,不妨将这些冲突的小孩之间相互连线,然后求出不产生冲突的最大点集,于是本题就转化为了最大独立集问题。最大独立集=总点数-最大匹配数。

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
using namespace std; const int M=;
int match[M];
bool vis[M];
vector<int>map[M];
string lk[M],dislk[M];
int n,m,p,uN;
bool dfs(int u){
for(int i=;i<map[u].size();i++){
if(!vis[map[u][i]]){
vis[map[u][i]]=true;
if(match[map[u][i]]==-||dfs(match[map[u][i]])){
match[map[u][i]]=u;
return true;
}
}
}
return false;
}
int hungary(){
int res=;
memset(match,-,sizeof(match));
for(int u=;u<p;u++){
memset(vis,false,sizeof(vis));
res+=dfs(u);
}
return res;
}
int main(){
while(scanf("%d%d%d",&n,&m,&p)!=EOF){
for(int i=;i<M;i++)map[i].clear();
for(int i=;i<p;i++){
cin>>lk[i]>>dislk[i];
}
for(int i=;i<p;i++)
for(int j=i+;j<p;j++)
if(lk[i]==dislk[j]||dislk[i]==lk[j]){ //产生矛盾的人之间建立无向边
map[i].push_back(j);
map[j].push_back(i);
}
printf("%d\n",p-hungary()/); //最大独立集=总点数-最大匹配
}
return ;
}

2018-11-16

最新文章

  1. 关于ueditor1_4_3 上传出现无法加载配置的问题
  2. python修改excel文件
  3. 前端神器 Firebug 2.0 新特性一览
  4. C和设计原则
  5. 修改浏览器accept使支持@ResponseBody
  6. DTO学习系列之AutoMapper(五)----当EntityFramework爱上AutoMapper
  7. 使用JMX实现的内存监控(转)
  8. Objective-C中的面向对象编程
  9. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
  10. 代码管理必备-----git使用上传码云
  11. cocos2d 判断旋转矩形是否包含某个点
  12. centos7 安装 oh my zsh
  13. lzstring
  14. xcode工程编译错误:一般错误总结
  15. Win10系统 安装Anaconda+TensorFlow+Keras
  16. CALayer的上动画的暂停和恢复
  17. Inline函数使用注意事项
  18. 关于filter web api mvc 权限验证 这里说的够详细了。。。
  19. Brophp Nginx 虚拟主机的配置
  20. Java并发编程(八)线程间协作(上)

热门文章

  1. oracle提高查询效率的34条方法
  2. Confluence 6 使用 JMX 界面实时监控
  3. Confluence 6 后台中为站点添加应用导航
  4. python之属性描述符与属性查找规则
  5. ionic3 点击输入 框弹出白色遮罩 并把 界面顶到上面
  6. vue之node.js的简单介绍
  7. lightoj1259 线性筛的另一种写法 v变成bool标记数组
  8. ZOJ 4057 XOR Clique(位运算)
  9. OpenCV-Python入门教程4-颜色空间转换
  10. Linux-server-sshd