题目大意:一个矩阵,一些点被拿掉,在棋盘上马走日,马之间不能落在同一点,求最多放几匹马。

采用对矩阵黑白染色,画个图可以发现:马可以走到的位置和他所处的位置颜色不同,将马和他可以走到的位置连边,最多可以放多少马,相当于求图的最大独立集(任意一条边的两个端点不会同时被选中)。

用黑白染色将节点按颜色分成两类,就是一个二分图。

题解代码:

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define maxn 40000
  4. 4 struct edge{
  5. 5 int to,nxt;
  6. 6 }e[maxn*8+5];
  7. 7 bool vis[maxn+5];
  8. 8 char Map[maxn+5][maxn+5];//存矩阵
  9. 9 int head[maxn+5]={0},link[maxn+5];
  10. 10 int dx[9]={-1,1,-2,2,-1,1,-2,2};
  11. 11 int dy[9]={-2,-2,-1,-1,2,2,1,1};//马走日的八个方位
  12. 12 int n,p,ans,cnt;
  13. 13
  14. 14 void add(int x,int y){//用矩阵中方格的编号建图
  15. 15 e[++cnt].nxt=head[x];
  16. 16 head[x]=cnt;
  17. 17 e[cnt].to=y;
  18. 18 }
  19. 19
  20. 20 int Getnum(int x,int y){//得到该点编号,相当于一个矩阵从左上依次数
  21. 21 return (x-1)*n+y;
  22. 22 }
  23. 23
  24. 24 void read(){
  25. 25 scanf("%d",&n);
  26. 26 for(int i=1;i<=n;i++)
  27. 27 for(int j=1;j<=n;j++){
  28. 28 cin>>Map[i][j];
  29. 29 if(Map[i][j]=='1') p++;//统计障碍数
  30. 30 }
  31. 31 for(int i=1;i<=n;i++)
  32. 32 for(int j=1;j<=n;j++)
  33. 33 if(Map[i][j]=='0'&&(i+j)%2)//用黑白染色,左上是黑,(i+j)%2表示白色
  34. 34 for(int k=0;k<8;k++){//八个方位遍历
  35. 35 int tx=i+dx[k];
  36. 36 int ty=j+dy[k];
  37. 37 if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&Map[tx][ty]=='0'){//满足条件
  38. 38 add(Getnum(i,j),Getnum(tx,ty));
  39. 39 }
  40. 40 }
  41. 41
  42. 42 }
  43. 43
  44. 44 bool match(int x){//标准的匈牙利算法
  45. 45 for(int i=head[x];i;i=e[i].nxt){
  46. 46 int v=e[i].to;
  47. 47 if(!vis[v]){
  48. 48 vis[v]=1;
  49. 49 if(!link[v]||match(link[v])){
  50. 50 link[v]=x;
  51. 51 return true;
  52. 52 }
  53. 53 }
  54. 54 }
  55. 55 return false;
  56. 56 }
  57. 57
  58. 58 void solve(){
  59. 59 for(int i=1;i<=n;i++)
  60. 60 for(int j=1;j<=n;j++)
  61. 61 if(Map[i][j]=='0'&&(i+j)%2){
  62. 62 memset(vis,0,sizeof(vis));
  63. 63 if(match(Getnum(i,j))) ans++;
  64. 64 }
  65. 65 cout<<n*n-p-ans;//最大独立集=节点总数减去最大匹配
  66. 66 }
  67. 67
  68. 68 int main(){
  69. 69 read();
  70. 70 solve();
  71. 71 return 0;
  72. 72 }

洛谷P4304 TJOI2013 攻击装置 (二分图匹配)的更多相关文章

  1. 洛谷P4304 [TJOI2013]攻击装置 题解

    题目链接: https://www.luogu.org/problemnew/show/P4304 分析: 最大独立集 最大独立集=总点数-最大匹配数 独立集:点集,图中选一堆点,这堆点两两之间没有连 ...

  2. 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)

    3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...

  3. 洛咕 P4304 [TJOI2013]攻击装置

    把坐标按照(x+y)%2染色可以发现这是个二分图 二分图最大独立集=点数-最大匹配 于是就是个算匹配的傻逼题了 // luogu-judger-enable-o2 #include<bits/s ...

  4. [TJOI2013] 攻击装置 - 二分图匹配

    给定 \(N \times N\) 棋盘,某些格子是障碍,问可以放置的互不侵犯的马的个数 黑白染色后建立二分图,求最大独立集 = 总点数 - 最大匹配数 注意把反边也连上会WA掉(脑抽一发血) #in ...

  5. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  6. BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...

  7. 洛谷 P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  8. P4304 [TJOI2013]攻击装置 最小割

    $ \color{#0066ff}{ 题目描述 }$ 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照"日"字攻击其周围的8个位置(x-1, ...

  9. 洛谷—— P3386 【模板】二分图匹配

    P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每 ...

随机推荐

  1. 【ASP.NET Core】选项类的依赖注入

    咱们继续上一个话题.先简单复习一下,根据老周前面文章的介绍,选项类体系的基本套路是通过 IOptionsFactory 来创建选项类实例的.而我们在服务容器(IServiceCollection)上是 ...

  2. 心动不如行动,基于Docker安装关系型数据库PostgrelSQL替代Mysql

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_171 最近"全栈数据库"的概念甚嚣尘上,主角就是PostgrelSQL,它最近这几年的技术发展不可谓不猛,覆盖 ...

  3. Java源码分析 | Object

    本文基于 OracleJDK 11, HotSpot 虚拟机. Object 定义 Object 类是类层次结构的根.每个类都有 Object 类作为超类.所有对象,包括数组等,都实现了这个类的方法. ...

  4. dentry的引用计数不对导致的crash

    [17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...

  5. Atcoder ZONe Energy Programming Contest C - MAD TEAM(二分)

    文章目录 题面 Sample Input Sample output 题解 CODE 别的做法 暴力 Dynamic Programming 题面 你想从 N N N 个候选人中选 3 个人. 每个人 ...

  6. 在 node 中使用 jquery ajax

    对于前端同学来说,ajax 请求应该不会陌生.jquery 真的ajax请求做了封装,可以通过下面的方式发送一个请求并获取相应结果: $.ajax({ url: "https://echo. ...

  7. 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。

    `void swap(int *a,int *b,int c){ if(a < *b){ int temp = *a; //防止temp没有初始化 随机存放地址指向系统工作区间 可以对temp初 ...

  8. bulk collect 在KingbaseES和Oracle的使用方法比较

    概述 BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNI ...

  9. Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):2、PGP下载安装与密钥生成发布

    文章目录: Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):1.JIRA账号注册 Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):2.PGP ...

  10. 利用京东云Web应用防火墙实现Web入侵防护

    摘 要 本指南描述如何利用京东云Web应用防火墙(简称WAF),对一个简单的网站(无论运行在京东云.其它公有云或者IDC)进行Web完全防护的全过程.该指南包括如下内容: 1 准备环境 1.1 在京东 ...