「CH6901」骑士放置

传送门

将棋盘黑白染色,发现“日”字的两个顶点刚好一黑一白,构成一张二分图。

那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑、白点连边。

当然,障碍点不会被连任何边。

那么我们每割掉一条黑白点之间的边,就会减少 \(1\) 的答案。

那么为了答案最大就是 $n \times m - t - $ 最小割。

参考代码:

  1. #include <cstring>
  2. #include <cstdio>
  3. #include <queue>
  4. #define rg register
  5. #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
  6. using namespace std;
  7. template < class T > inline void read(T& s) {
  8. s = 0; int f = 0; char c = getchar();
  9. while ('0' > c || c > '9') f |= c == '-', c = getchar();
  10. while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
  11. s = f ? -s : s;
  12. }
  13. const int _ = 1e4 + 5, __ = 1e5 + 5, INF = 2147483647;
  14. const int dx[] = { -1, -1, -2, -2, 1, 1, 2, 2 };
  15. const int dy[] = { -2, 2, -1, 1, -2, 2, -1, 1 };
  16. int tot = 1, head[_], nxt[__ << 1], ver[__ << 1], cap[__ << 1];
  17. inline void Add_edge(int u, int v, int d)
  18. { nxt[++tot] = head[u], head[u] = tot, ver[tot] = v, cap[tot] = d; }
  19. inline void link(int u, int v, int d) { Add_edge(u, v, d), Add_edge(v, u, 0); }
  20. int N, M, T, ch[102][102], s, t, dep[_], cur[_];
  21. inline int id(int x, int y) { return y + (x - 1) * M; }
  22. inline int bfs() {
  23. static queue < int > Q;
  24. while (!Q.empty()) Q.pop();
  25. memset(dep, 0, sizeof dep);
  26. Q.push(s), dep[s] = 1;
  27. while (!Q.empty()) {
  28. int u = Q.front(); Q.pop();
  29. for (rg int i = head[u]; i; i = nxt[i]) {
  30. int v = ver[i];
  31. if (dep[v] == 0 && cap[i] > 0)
  32. dep[v] = dep[u] + 1, Q.push(v);
  33. }
  34. }
  35. return dep[t] > 0;
  36. }
  37. inline int dfs(int u, int flow) {
  38. if (u == t) return flow;
  39. for (rg int &i = cur[u]; i; i = nxt[i]) {
  40. int v = ver[i];
  41. if (dep[v] == dep[u] + 1&& cap[i] > 0) {
  42. int res = dfs(v, min(cap[i], flow));
  43. if (res) { cap[i] -= res, cap[i ^ 1] += res; return res; }
  44. }
  45. }
  46. return 0;
  47. }
  48. inline int Dinic() {
  49. int res = 0;
  50. while (bfs()) {
  51. for (rg int i = s; i <= t; ++i) cur[i] = head[i];
  52. while (int d = dfs(s, INF)) res += d;
  53. }
  54. return res;
  55. }
  56. int main() {
  57. #ifndef ONLINE_JUDGE
  58. file("cpp");
  59. #endif
  60. read(N), read(M), read(T);
  61. for (rg int x, y, i = 1; i <= T; ++i) read(x), read(y), ch[x][y] = 1;
  62. s = 0, t = N * M + 1;
  63. for (rg int i = 1; i <= N; ++i)
  64. for (rg int j = 1; j <= M; ++j) {
  65. if (ch[i][j]) continue;
  66. if (i + j & 1) {
  67. link(s, id(i, j), 1);
  68. for (rg int k = 0; k < 8; ++k) {
  69. int ni = i + dx[k], nj = j + dy[k];
  70. if (ni >= 1 && ni <= N && nj >= 1 && nj <= M && !ch[i][j])
  71. link(id(i, j), id(ni, nj), 1);
  72. }
  73. } else link(id(i, j), t, 1);
  74. }
  75. printf("%d\n", N * M - T - Dinic());
  76. return 0;
  77. }

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

  1. 【CH6901】骑士放置

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

  2. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  3. 「AHOI2014/JSOI2014」骑士游戏

    「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...

  4. 「插件」Runner更新Pro版,帮助设计师远离996

    三年多前Runner团队在德国汉堡的骇客松上第一次发布了Sketch插件Runner的beta版本.从那以后,这个团队的目标一直很清晰: 创造一个加速设计工作流的工具. 他们只给Runner添加真正能 ...

  5. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  6. LOJ2135 「ZJOI2015」幻想乡战略游戏

    题意 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和 ...

  7. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  8. 零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」

    原文:零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器 ...

  9. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

随机推荐

  1. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException

    实体类缺少无参构造方法,序列化对象需要无参构造方法 @NoArgsConstructor

  2. pandas库笔记

    本笔记为自学笔记 1.pandas.DataFrame() 一种保存矩阵的数据格式 grades_df = pd.DataFrame( data={'exam1': [43, 81, 78, 75, ...

  3. Python学习(三)——Python的运算符和数值、字符的类中方法

    Python开发IDE PyCharm,eclipse PyCharm的基础用法 全部选中后 Ctrl+?全部变为注释 运算符 结果为值的运算符 算术运算符: + - * / % // ** 赋值运算 ...

  4. Servlet线程安全问题(转载)

    转载地址:https://www.cnblogs.com/LipeiNet/p/5699944.html 前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安 ...

  5. Shiro入门学习之自定义Realm实现认证(四)

    一.概述 Shirom默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,而大部分情况下需要从系统数据库中读取用户信息,所以需要实现自定义Realm,Realm接口如下: ...

  6. C语言:将字符串中的前导*号全部移到字符串的尾部。

    //规定输入的字符串中只包含字母和*号,fun函数:将字符串中的前导*号全部移到字符串的尾部. #include <stdio.h> void fun( char *a ) { ]; ch ...

  7. C:clock() 计算代码执行时间

    clock():捕捉从程序开始运行到clock()被调用时所耗费的事件. 这个时间的单位是 clock tick,即时钟打点 常数 CLK_TCK:机器时钟每秒走的时钟打点数 要使用这个函数需要包含头 ...

  8. ZOJ1008 Gnome Tetravex

    DFS+剪枝~ #include<bits/stdc++.h> using namespace std; ][]; int N; int cnt; ]; ]; unordered_map& ...

  9. c#活动目录操作

    c#活动目录操作  https://www.cnblogs.com/ahuo/archive/2007/03/16/676853.html 添加引用 System.DirectoryServices导 ...

  10. 树莓派4B踩坑指南 - (9)安装Git和Docker

    安装Git sudo apt-get install wget git-core 安装Docker curl -sSL https://get.docker.com | sh # 树莓派专属脚本福利, ...