原题链接

和棋盘覆盖(题解)差不多.。

同样对格子染色,显然日字的对角格子是不同色,直接在对应节点连边,然后就是二分图最大独立集问题。

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int N = 1e4 + 10;
  5. const int M = 2.6e7 + 10;
  6. int fi[N], di[M], ne[M], mtc[N], mo_x[8] = { -1, -2, -2, -1, 1, 2, 2, 1 }, mo_y[8] = { -2, -1, 1, 2, -2, -1, 1, 2 }, l, n, m;
  7. bool v[N], a[102][102];
  8. inline int re()
  9. {
  10. int x = 0;
  11. char c = getchar();
  12. bool p = 0;
  13. for (; c < '0' || c > '9'; c = getchar())
  14. p |= c == '-';
  15. for (; c >= '0' && c <= '9'; c = getchar())
  16. x = x * 10 + c - '0';
  17. return p ? -x : x;
  18. }
  19. inline void add(int x, int y)
  20. {
  21. di[++l] = y;
  22. ne[l] = fi[x];
  23. fi[x] = l;
  24. }
  25. inline int ch(int x, int y)
  26. {
  27. return (x - 1) * m + y;
  28. }
  29. bool dfs(int x)
  30. {
  31. int i, y;
  32. for (i = fi[x]; i; i = ne[i])
  33. if (!v[y = di[i]])
  34. {
  35. v[y] = 1;
  36. if (!mtc[y] || dfs(mtc[y]))
  37. {
  38. mtc[y] = x;
  39. return true;
  40. }
  41. }
  42. return false;
  43. }
  44. int main()
  45. {
  46. int i, x, y, j, s = 0, k, o;
  47. n = re();
  48. m = re();
  49. k = re();
  50. for (i = 1; i <= k; i++)
  51. {
  52. x = re();
  53. y = re();
  54. a[x][y] = 1;
  55. }
  56. for (i = 1; i <= n; i++)
  57. for (j = 1; j <= m; j++)
  58. if (!a[i][j] && !((i + j) & 1))
  59. for (o = 0; o < 8; o++)
  60. {
  61. x = i + mo_x[o];
  62. y = j + mo_y[o];
  63. if (x > 0 && x <= n && y > 0 && y <= m && !a[x][y])
  64. add(ch(i, j), ch(x, y));
  65. }
  66. for (i = 1; i <= n; i++)
  67. for (j = 1; j <= m; j++)
  68. if (!a[i][j] && !((i + j) & 1))
  69. {
  70. memset(v, 0, sizeof(v));
  71. if (dfs(ch(i, j)))
  72. s++;
  73. }
  74. printf("%d", n * m - s - k);
  75. return 0;
  76. }

CH6901 骑士放置的更多相关文章

  1. 「CH6901」骑士放置

    「CH6901」骑士放置 传送门 将棋盘黑白染色,发现"日"字的两个顶点刚好一黑一白,构成一张二分图. 那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑.白点连边. 当 ...

  2. 【CH6901】骑士放置

    题目大意:给定一个 N*M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照" ...

  3. AcWing P378 骑士放置 题解

    Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...

  4. vijos p1729 Knights

    描述 在一个N*N的正方形棋盘上,放置了一些骑士.我们将棋盘的行用1开始的N个自然数标记,将列用'A'开始的N个大写英文字母标记.举个例子来说,一个标准的8*8的国际象棋棋盘的行标记为1..8,列标记 ...

  5. 【vijos】1729 Knights(匈牙利)

    https://vijos.org/p/1729 这题好奇葩,为嘛N开到30就会re啊..........n<=26吗.... sad 因为根据棋子的分布,能攻击的一定各在一黑白格上,所以直接二 ...

  6. COGS746. [网络流24题] 骑士共存

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  7. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...

  8. 【wikioi】1922 骑士共存问题(网络流/二分图匹配)

    用匈牙利tle啊喂?和网络流不都是n^3的吗(匈牙利O(nm), isap O(n^2m) 但是isap实际复杂度很优的(二分图匹配中,dinic是O(sqrt(V)*E),不知道isap是不是一样. ...

  9. 【刷题】LOJ 6226 「网络流 24 题」骑士共存问题

    题目描述 在一个 \(\text{n} \times \text{n}\) 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的 \(\t ...

随机推荐

  1. 微信小程序----搜索框input回车搜索事件

    在微信小程序里的搜索框,按软键盘回车键触发搜索事件. <input type="text"  placeholder="搜索" value="{ ...

  2. centos mongodb

    cd到mongodb目录下的bin文件夹,执行命令./mongo 运行如下: [root@namenode mongodb]# ./bin/mongo MongoDB shell version: 1 ...

  3. CentOS上开启MySQL远程访问权限

    在CentOS上安装完MySQL后,默认不开始远程访问控制.可以进行如下设定开启. 登录MySQL: mysql -uroot -p 如需修改密码,第一次: mysqladmin -u root pa ...

  4. ServiceWorker.state

    [ServiceWorker.state] ServiceWorker.state The state read-only property of the ServiceWorker interfac ...

  5. Webpack Plugin

    [Webpack Plugin] Since Loaders only execute transforms on a per-file basis, plugins are most commonl ...

  6. Oracle怎么修改字段类型

    转载:https://www.2cto.com/database/201710/689523.html 有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管 ...

  7. Flask中的蓝图(BluePrint)、

    蓝图 1.初识Flask蓝图(BluePrint) 创建一个项目然后将目录结构做成: user.py中的内容 from flask import Blueprint, render_template ...

  8. java中替换${xx}

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class replace { public static ...

  9. 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  10. TZOJ 3665 方格取数(2)(最大点权独立集)

    描述 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. 输入 包括多个测试实例 ...