二分图匹配(网络流实现)

  1. # include <bits/stdc++.h>
  2. # define IL inline
  3. # define RG register
  4. # define Fill(a, b) memset(a, b, sizeof(a))
  5. # define Copy(a, b) memcpy(a, b, sizeof(a))
  6. using namespace std;
  7. typedef long long ll;
  8. const int _(10010), __(1e6 + 10), INF(1e9);
  9. IL ll Read(){
  10. RG char c = getchar(); RG ll x = 0, z = 1;
  11. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  12. for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  13. return x * z;
  14. }
  15. int n, m, w[__], fst[_], nxt[__], to[__], cnt, num = 1, id1[60][60], id2[60][60];
  16. int S, T, lev[_], cur[_], max_flow;
  17. queue <int> Q;
  18. IL void Add(RG int u, RG int v, RG int f){
  19. w[cnt] = f; to[cnt] = v; nxt[cnt] = fst[u]; fst[u] = cnt++;
  20. w[cnt] = 0; to[cnt] = u; nxt[cnt] = fst[v]; fst[v] = cnt++;
  21. }
  22. IL int Dfs(RG int u, RG int maxf){
  23. if(u == T) return maxf;
  24. RG int ret = 0;
  25. for(RG int &e = cur[u]; e != -1; e = nxt[e]){
  26. if(lev[to[e]] != lev[u] + 1 || !w[e]) continue;
  27. RG int f = Dfs(to[e], min(w[e], maxf - ret));
  28. ret += f; w[e ^ 1] += f; w[e] -= f;
  29. if(ret == maxf) break;
  30. }
  31. return ret;
  32. }
  33. IL bool Bfs(){
  34. Fill(lev, 0); lev[S] = 1; Q.push(S);
  35. while(!Q.empty()){
  36. RG int u = Q.front(); Q.pop();
  37. for(RG int e = fst[u]; e != -1; e = nxt[e]){
  38. if(lev[to[e]] || !w[e]) continue;
  39. lev[to[e]] = lev[u] + 1;
  40. Q.push(to[e]);
  41. }
  42. }
  43. return lev[T];
  44. }
  45. int main(RG int argc, RG char* argv[]){
  46. n = Read(); m = Read(); Fill(fst, -1); T = 1;
  47. for(RG int i = 1; i <= n; ++i)
  48. for(RG int j = 1; j <= m; ++j){
  49. RG char c; scanf(" %c", &c);
  50. if(c != '#'){
  51. if(!id1[i - 1][j]) id1[i][j] = ++num, Add(S, id1[i][j], 1);
  52. else id1[i][j] = id1[i - 1][j];
  53. if(!id2[i][j - 1]) id2[i][j] = ++num, Add(id2[i][j], T, 1);
  54. else id2[i][j] = id2[i][j - 1];
  55. if(c != 'x') Add(id1[i][j], id2[i][j], 1);
  56. }
  57. }
  58. while(Bfs()) Copy(cur, fst), max_flow += Dfs(S, INF);
  59. printf("%d\n", max_flow);
  60. return 0;
  61. }

[HEOI2016]游戏的更多相关文章

  1. bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...

  2. BZOJ4554 - [TJOI2016&HEOI2016]游戏

    原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...

  3. BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配

    BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若 ...

  4. BZOJ 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 Descripti ...

  5. 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配

    [BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...

  6. [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)

    4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 857  Solved: 506[Sub ...

  7. bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)

    4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...

  8. BZOJ4554: [Tjoi2016&Heoi2016]游戏

    Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  9. BZOJ 4554: [Tjoi2016&Heoi2016]游戏

    Time Limit: 20 Sec Memory Limit: 128 MB Submit: 951 Solved: 572 [Submit][Status][Discuss] Descriptio ...

  10. 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...

随机推荐

  1. CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程

    请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...

  2. GO开发:接口

    接口 接口定义 Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. type example interface{ Method1(参数列表) 返回值 ...

  3. linux命令详解:pgrep命令

    转载:http://www.th7.cn/system/lin/201311/46742.shtml 前言    经常要查看进程的信息,包括进程的是否已经消亡,通过pgrep来获得正在被调度的进程的相 ...

  4. 原创~vue router-link添加点击事件

    在学习vue中会遇到给router-link添加@click,@mouseover等事件 我想要做的是用v-for循环输出导航菜单,但是下面代码的@click事件和@mouseover并不会响应 &l ...

  5. python入门学习笔记(三)

    10.函数 求绝对值的函数 abs(x) 也可以在交互式命令行通过 help(abs) 查看abs函数的帮助信息.调用 abs 函数:>>> abs(100)100>>& ...

  6. Git 上传 GitHub

    1.下载 2.安装 3.功能识别 3-1.查看git版本  git  --version 3-2.移除原来的版本 yum  remove git 4.配置 4-1.用户配置信息 git config ...

  7. 通过核心概念了解webpack工作机制

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...

  8. (MonoGame从入门到放弃-3)-放弃MonoGame

    又一段时间过去了,这一章没内容了.我真的已经放弃MonoGame的学习了,MonoGame用起来感觉就是在自己实现2d游戏引擎一样,好多现代游戏引擎有的内容都没有...,我只是想做游戏,而不是给引擎添 ...

  9. KV型内存数据库Redis

    Redis是开源的高性能内存Key-Value数据库, 可以提供事务和持久化支持, 并提供了TTL(time to life)服务. Redis采用单线程数据操作+非阻塞IO的模型,非阻塞IO提供了较 ...

  10. Phpstrom操作Git从服务器端克隆代码到本地

    1.第一步点开Git 2.添加项目的路径 第一个框是你所在的项目路径,后缀名是.git,这里我用的是HTTPS的方式(还有一种是SSH) 第二是你要克隆到所在目录,我的是在Apache下面的htdoc ...