题意:

有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);
}
}

最新文章

  1. startssl申请配置免费https证书
  2. 解决ssh-connect-to-host-github-com-port-22-connection-timed-out
  3. X230 安装win7 sp1
  4. android 上传文件用php程序在服务端接受(一)
  5. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记19 为Demo添加手势
  6. cocos2dx SpriteBatchNode 精灵的渲染优化类
  7. puppet安装和使用
  8. CIC and Fir 滤波器的级联
  9. Codeforces#371 Div2
  10. Java随机数和UUID
  11. [转]Python爬虫框架--pyspider初体验
  12. jquery性能优化的38个建议
  13. Excel—错误解释
  14. python 初级重点
  15. FAIR开源Detectron:整合全部顶尖目标检测算法
  16. HDU 1022 火车进站【栈】
  17. Java笔记(五)泛型
  18. 网页一键加入QQ群
  19. 去除HTML5 SUMMARY 标签前的三角形
  20. EasyUITree设置节点选中

热门文章

  1. java设计模式,工厂,代理模式等
  2. OpenGL渲染管道,Shader,VAO&amp;VBO&amp;EBO
  3. use关键字在PHP中的几种用法
  4. centos7.6,nginx1.18,php-7.4.6,mysql-5.7.30 安装
  5. Java面向对象系列(5)- 构造器详解
  6. Centos8.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台
  7. JavaScript对象的两类属性(数据属性与访问器属性)
  8. Java对象构造
  9. centos实现免密登陆及远程操作
  10. 羽夏逆向破解日记簿——RunAsDate的实现原理分析