POJ 3692 Kindergarten(二分图最大独立集)
2024-08-31 15:30:34
题意:
有G个女孩,B个男孩。女孩彼此互相认识,男孩也彼此互相认识。有M对男孩和女孩是认识的。分别是(g1,b1),.....(gm,bm)。
现在老师要在这G+B个小孩中挑出一些人,条件是这些人都互相认识。问最多可以挑出多少人。
思路:
女孩之间互相认识,男孩之间互相认识,所以我们可以将连边定义为:不认识。即:若两个节点之间有连边,则两个节点互不认识。
故题意即为选出最多的点使得这些点任意两点之间没有连边。即选最少的点覆盖所有边。(二分图最大独立集/二分图最小点覆盖)
代码:
vector<int> graph[205];
int cx[205],cy[205];
bool bmask[205];
int G,B,M;
bool mp[205][205]; int findPath(int u){
int L=graph[u].size();
rep(i,0,L-1){
int v=graph[u][i];
if(!bmask[v]){
bmask[v]=true;
if(cy[v]==-1||findPath(cy[v])){
cy[v]=u;
cx[u]=v;
return 1;
}
}
}
return 0;
}
int MaxMatch(){
int ans=0;
rep(i,1,G) cx[i]=-1;
rep(i,1,B) cy[i]=-1;
rep(i,1,G) if(cx[i]==-1){
mem(bmask,false);
ans+=findPath(i);
}
return ans;
} int main(){
int tcase=0;
while(scanf("%d%d%d",&G,&B,&M)!=EOF){
if(!G && !B && !M) break; rep(i,1,G) graph[i].clear();
mem(mp,false); while(M--){
int x,y;
scanf("%d%d",&x,&y);
mp[x][y]=true;
}
rep(i,1,G) rep(j,1,B) if(false==mp[i][j]) graph[i].push_back(j); int dd=MaxMatch();
printf("Case %d: %d\n",++tcase,G+B-dd);
}
}
最新文章
- startssl申请配置免费https证书
- 解决ssh-connect-to-host-github-com-port-22-connection-timed-out
- X230 安装win7 sp1
- android 上传文件用php程序在服务端接受(一)
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记19 为Demo添加手势
- cocos2dx SpriteBatchNode 精灵的渲染优化类
- puppet安装和使用
- CIC and Fir 滤波器的级联
- Codeforces#371 Div2
- Java随机数和UUID
- [转]Python爬虫框架--pyspider初体验
- jquery性能优化的38个建议
- Excel—错误解释
- python 初级重点
- FAIR开源Detectron:整合全部顶尖目标检测算法
- HDU 1022 火车进站【栈】
- Java笔记(五)泛型
- 网页一键加入QQ群
- 去除HTML5 SUMMARY 标签前的三角形
- EasyUITree设置节点选中
热门文章
- java设计模式,工厂,代理模式等
- OpenGL渲染管道,Shader,VAO&;VBO&;EBO
- use关键字在PHP中的几种用法
- centos7.6,nginx1.18,php-7.4.6,mysql-5.7.30 安装
- Java面向对象系列(5)- 构造器详解
- Centos8.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台
- JavaScript对象的两类属性(数据属性与访问器属性)
- Java对象构造
- centos实现免密登陆及远程操作
- 羽夏逆向破解日记簿——RunAsDate的实现原理分析