记横联通是一块横着的没有硬石头的地,把他们编号。竖联通同理。

对于一个空地,将其横联通编号和竖联通编号连边,二分图匹配,最大匹配为答案。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. using namespace std;
  6. int n, m, hr[55][55], sr[55][55], hcnt, scnt, hea[5005], cnt, yy, tt, lev[5005];
  7. int maxFlow, cur[5005];
  8. const int oo=0x3f3f3f3f;
  9. char ss[55][55];
  10. queue<int> d;
  11. struct Edge{
  12. int too, nxt, val;
  13. }edge[10005];
  14. void add_edge(int fro, int too, int val){
  15. edge[cnt].nxt = hea[fro];
  16. edge[cnt].val = val;
  17. edge[cnt].too = too;
  18. hea[fro] = cnt++;
  19. }
  20. void addEdge(int fro, int too, int val){
  21. add_edge(fro, too, val);
  22. add_edge(too, fro, 0);
  23. }
  24. bool bfs(){
  25. memset(lev, 0, sizeof(lev));
  26. lev[yy] = 1;
  27. d.push(yy);
  28. while(!d.empty()){
  29. int x=d.front();
  30. d.pop();
  31. for(int i=hea[x]; i!=-1; i=edge[i].nxt){
  32. int t=edge[i].too;
  33. if(!lev[t] && edge[i].val>0){
  34. lev[t] = lev[x] + 1;
  35. d.push(t);
  36. }
  37. }
  38. }
  39. return lev[tt]!=0;
  40. }
  41. int dfs(int x, int lim){
  42. if(x==tt) return lim;
  43. int addFlow=0;
  44. for(int &i=cur[x]; i!=-1; i=edge[i].nxt){
  45. int t=edge[i].too;
  46. if(lev[t]==lev[x]+1 && edge[i].val){
  47. int tmp=dfs(t, min(lim-addFlow, edge[i].val));
  48. edge[i].val -= tmp;
  49. edge[i^1].val += tmp;
  50. addFlow += tmp;
  51. if(addFlow==lim) break;
  52. }
  53. }
  54. return addFlow;
  55. }
  56. void dinic(){
  57. while(bfs()){
  58. for(int i=yy; i<=tt; i++) cur[i] = hea[i];
  59. maxFlow += dfs(yy, oo);
  60. }
  61. }
  62. int main(){
  63. cin>>n>>m;
  64. for(int i=1; i<=n; i++)
  65. scanf("%s", ss[i]+1);
  66. for(int i=1; i<=n; i++)
  67. for(int j=1; j<=m; j++)
  68. if(!hr[i][j] && ss[i][j]!='#'){
  69. hcnt++;
  70. for(int k=j; k<=m && ss[i][k]!='#'; k++)
  71. hr[i][k] = hcnt;
  72. }
  73. for(int i=1; i<=n; i++)
  74. for(int j=1; j<=m; j++)
  75. if(!sr[i][j] && ss[i][j]!='#'){
  76. scnt++;
  77. for(int k=i; k<=n && ss[k][j]!='#'; k++)
  78. sr[k][j] = scnt;
  79. }
  80. memset(hea, -1, sizeof(hea));
  81. for(int i=1; i<=n; i++)
  82. for(int j=1; j<=m; j++)
  83. if(ss[i][j]=='*')
  84. addEdge(hr[i][j], hcnt+sr[i][j], 1);
  85. yy = 0; tt = hcnt + scnt + 1;
  86. for(int i=1; i<=hcnt; i++)
  87. addEdge(yy, i, 1);
  88. for(int i=1; i<=scnt; i++)
  89. addEdge(i+hcnt, tt, 1);
  90. dinic();
  91. cout<<maxFlow<<endl;
  92. return 0;
  93. }

loj2057 「TJOI / HEOI2016」游戏的更多相关文章

  1. AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

    #2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...

  2. 【LOJ】#2057. 「TJOI / HEOI2016」游戏

    题解 我并不会做,我觉得很像网络流但是毫无建图思路 我猜了个贪心,写了一下--啥过了90分?!这数据是有多水啊.. 哦又是行列拆点 不过要按照'#'进行拆点,也就是一段横着的区间只能放一个炸弹,一段竖 ...

  3. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  4. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

  5. AC日记——#2054. 「TJOI / HEOI2016」树

    #2054. 「TJOI / HEOI2016」树 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include < ...

  6. loj #2055. 「TJOI / HEOI2016」排序

    #2055. 「TJOI / HEOI2016」排序   题目描述 在 2016 年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个 ...

  7. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  8. LOJ #2058「TJOI / HEOI2016」求和

    不错的推柿子题 LOJ #2058 题意:求$\sum\limits_{i=0}^n\sum\limits_{j=0}^nS(i,j)·2^j·j!$其中$ S(n,m)$是第二类斯特林数 $ Sol ...

  9. loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增

    题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...

随机推荐

  1. python全栈测试题(一)

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式即终端命令下和python环境中 2.Pyhton单行注释和多行注释分别用什么? pyt ...

  2. MATLAB之数据处理+公式拟合

    MATLAB之数据处理+公式拟合 前言:由试验得到一组数据,对该组数据进行处理,作图分析,分析各变量的关系,期望得到拟合公式. 试验数据背景 本次试验有三个自变量:V.M.G,因变量为F,每组试验重复 ...

  3. mysql 5.7以上安装遇到的问题

    参考地址:  https://blog.csdn.net/u012278016/article/details/80455439 本人在window上安装mysql 5.7版本以上的mysql,出现很 ...

  4. cms-详细页面-3

    1.设置上一条.下一条数据 2.使用昌言插件 3.点击链接帖子的访问数加一 1.在mapper中设置分页: <?xml version="1.0" encoding=&quo ...

  5. 感知器及其Python实现

    感知器是由美国计算机科学家罗森布拉特(F.Roseblatt)于1957年提出的.感知器可谓是最早的人工神经网络.单层感知器是一个具有一层神经元.采用阈值激活函数的前向网络.通过对网络权值的训练,可以 ...

  6. 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。

    import java.util.Scanner; /** * 需求:从键盘输入任意0~9999之间的整数,输出这个整数各位数字之和. * 思路:方法一,使用扫描器Scanner类,扫描控制台输入流 ...

  7. java设计模式1--单例模式

    1:单例模式简介 单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例.总而言之就是在系统中只会存在一个对象,其中的数据是共享的 特点: 单例类只能有一 ...

  8. SpringBoot显式事务

    参考:https://www.jianshu.com/p/f5fc14bde8a0 后续测试代码的完整项目:https://files.cnblogs.com/files/hellohello/dem ...

  9. vue.js 图表chart.js使用

    在使用这个chart.js之前,自己写过一个饼图,总之碰到的问题不少,所以能用现成的插件就用,能节省不少时间 这里不打算介绍chart.js里面详细的参数意义和各个参数的用法,只作为首次使用chart ...

  10. JavaScript 循环

    for循环:  如果您希望一遍又一遍运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: document.write(cars[0] + "<br ...