HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】
2024-09-15 05:26:07
<题目链接>
题目大意:
动物园有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
最新文章
- 关于ueditor1_4_3 上传出现无法加载配置的问题
- python修改excel文件
- 前端神器 Firebug 2.0 新特性一览
- C和设计原则
- 修改浏览器accept使支持@ResponseBody
- DTO学习系列之AutoMapper(五)----当EntityFramework爱上AutoMapper
- 使用JMX实现的内存监控(转)
- Objective-C中的面向对象编程
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
- 代码管理必备-----git使用上传码云
- cocos2d 判断旋转矩形是否包含某个点
- centos7 安装 oh my zsh
- lzstring
- xcode工程编译错误:一般错误总结
- Win10系统 安装Anaconda+TensorFlow+Keras
- CALayer的上动画的暂停和恢复
- Inline函数使用注意事项
- 关于filter web api mvc 权限验证 这里说的够详细了。。。
- Brophp Nginx 虚拟主机的配置
- Java并发编程(八)线程间协作(上)