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

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

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

题解代码:

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

    遇到问题和需求 我的电脑环境:先安装py2再安装py3,平时我工作中是使用python2,如何保证两个版本共存且让代码来选择要使用的版本. 遇到问题 在cmd中输入python,进入的是py2的环境, ...

  2. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...

  3. ASP.NET Web 应用 Docker踩坑历程——续

    ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...

  4. 在Centos7.3下使用Siege对Django服务进行压力测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_87 Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续 ...

  5. day13--Java常用类

    Java常用类 1.包装类 1.1什么是包装类? Java 是面向对象的语言,但不是"纯面向对象"的,比如我们经常用到的基本数据类型就不是对象. 在我们实际应用中,经常需要将基本数 ...

  6. Luogu2375 [NOI2014]动物园 (KMP)

    写炸,上网,不同KMP形态. 无力,照该,一换写法就过. 横批:我是垃圾 求\(next\)时\(DP\)出\(num\),路径压缩防卡\(n^2\) AC #include <iostream ...

  7. 使用 Vue.js 框架后的感想

    前言 用 Vue 已经有段时间了,把自己的所想所悟写下来,每一个想法都是非常宝贵的,记录成为生活,记录成为习惯. 简化开发 Vue 是可以辅助前端工程师开发 Web App 的一种框架,它节省很多时间 ...

  8. 第六十八篇:vue-cli新建项目

    好家伙,之前只是一股脑得用,连里面的可选配置项都不清楚,今天来把它搞清楚 1.单页面应用 1.1.什么是单页面应用程序 单页面应用程序(英文名: Single Page Application)简称S ...

  9. 第五十篇: webpack中的loader(一) --css-loader

    好家伙, 1.webpack配置中devServer节点的常用配置项 devServer:{ //首次打包完成后,自动打开浏览器 open:ture, //在http协议中,如果端口号是80,则可以被 ...

  10. 华为云计算灾备产品BCManager 及eBackup的组网方式

    BCManager的作用 OceanStor BCManager是面向企业数据中心存储容灾业务的管理软件,实现容灾.双活.两地三中心等容灾环境的管理,具备多种数据库应用与虚拟化环境的容灾管理功能,简单 ...