题意:

N行M列的矩阵,每个格子里不是 * 就是 O 。

* :是一个利益点。

O:是一个空白点。

每次可以用一个圈覆盖相邻的两个*。(左右相邻或上下相邻)。

问最少需要多少个圈可以覆盖所有的*。

思路:

把每个格子变成一个数,总共有N*M个数。构造二分图,左右的数字都分别是1....N*M。

若两个*可以被一个圈覆盖,则将它们对应在左边、右边的点连上线。

答案即为:*的总数 - 最大二分匹配的值/2(因为有一半是对称的)。

代码:

int T,n,m;
vector<int> graph[405];
bool bmask[405];
int cx[405],cy[405];
char s[45][15];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,n*m) cx[i]=cy[i]=-1;rep(i,1,n*m) if(cx[i]==-1){mem(bmask,false);ans+=findPath(i);}return ans;
}int main(){cin>>T;while(T--){scanf("%d%d",&n,&m);rep(i,1,n*m) graph[i].clear();int cc=0;rep(i,1,n) scanf("%s",s[i]);rep(i,1,n){rep(j,0,m-1) if(s[i][j]=='*'){int num=m*(i-1)+j+1;int u=i, v=j+1;if(v-1>=1 && s[u][j-1]=='*') graph[num].push_back(num-1);if(v+1<=m && s[u][j+1]=='*') graph[num].push_back(num+1);if(u-1>=1 && s[u-1][j]=='*') graph[num].push_back(num-m);if(u+1<=n && s[u+1][j]=='*') graph[num].push_back(num+m);++cc;}}int dd=MaxMatch();printf("%d\n",cc-dd/2);}
}

转载于:https://www.cnblogs.com/fish7/p/4088519.html

poj 3020 Antenna Placement(二分图最大匹配)相关推荐

  1. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  2. POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...

  3. POJ 3020 Antenna Placement

    解题思路:求解最大独立集,转而求解最小顶点覆盖->最大流问题 #include <iostream> using namespace std; int t; int father[4 ...

  4. pku 3020 Antenna Placement

    http://poj.org/problem?id=3020 求最小路径覆盖问题 ,对于有向图最小路径覆盖 = 一边的点数 (x集或y集)- 最大匹配 无向图最小路径覆盖 = 一边的点数 (x集或y集 ...

  5. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

  6. POJ - 1358 Housing Complexes(二分图最大匹配)

    题目链接:点击查看 题目大意:给出k块m*n大小的土地,每块土地由数字'0'或26个大写字母组成,大写字母代表住户,数字'0'代表空地,现在开发商想尽可能多的修建大楼,每个大楼需要占用h*w的面积,而 ...

  7. 解题报告 (九) 二分图最大匹配

    文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...

  8. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  9. 图论总结(一)二分图最大匹配

    二分图最大匹配 (一).二分图 1.定义 2.性质 3.判定 (二).二分图的匹配 1.二分图的最大匹配 2. König定理及其证明 3.最小边覆盖与最大独立集 (三).增广路径 1.定义 2.性质 ...

最新文章

  1. 基于Spark ALS算法的个性化推荐
  2. html怎么建边框,如何使用CSS创建多色边框?
  3. 微信小程序之redirectTo、switchTab和navigateTo
  4. 一步步学习SPD2010--第七章节--使用BCS业务连接服务
  5. 我对STL的一些看法(二)认识vector容器
  6. java:拷贝文件(夹)
  7. 客户连接多个服务端_Linux 服务端最大并发数是多少?
  8. idea 自动导入包操作及快捷键
  9. 【react】 react 中 前后端数据的交互方式 (原生的ajax、jq的ajax、axios、fetch )...
  10. java 读取yaml配置文件
  11. 微信小程序登陆流程详详详解 看这一篇就够了
  12. 大脑升维:人工智能浪潮下的适者生存之道
  13. TTL和RS232之间的详细对比转
  14. 我的世界JAVA挂机杀怪有经验_5分钟教你打造mc最简单的刷经验机!挂机就能无限经验?...
  15. 这位智商奇高的超级天才去了:他简直活出了别人八辈子的精彩!
  16. 惠普微型计算机w7系统,惠普笔记本电脑一键重装系统win7
  17. DSP原理学习笔记--第七章--增强直接存储器访问(EDMA)
  18. 伯努利随机序列 matlab,Bernoullibin-随机信号源-simulink-MatLab
  19. Exadata安装步骤
  20. 【案例】借助 SolidWorks 解决方案,实现第一架太阳能混合式飞艇的商业化

热门文章

  1. ConfigParser模块简明教程
  2. 微型计算机原理答案第四章,微机原理第四章习题答案.doc
  3. tf.matmul()研究【Python】
  4. 数值分析与算法-喻文健-国科大
  5. Error:(3, 32) java: 程序包org.springframework.boot不存在
  6. XML和实体类之间相互转换(序列化和反序列化)
  7. 根据内容来产生一个二维码
  8. Kubernetes中的nodePort,targetPort,port的区别和意义
  9. C++中的引用(257BinaryTreePath)
  10. 用SQL语句添加删除修改字段