洛谷P4304 TJOI2013 攻击装置 (二分图匹配)
题目大意:一个矩阵,一些点被拿掉,在棋盘上马走日,马之间不能落在同一点,求最多放几匹马。
采用对矩阵黑白染色,画个图可以发现:马可以走到的位置和他所处的位置颜色不同,将马和他可以走到的位置连边,最多可以放多少马,相当于求图的最大独立集(任意一条边的两个端点不会同时被选中)。
用黑白染色将节点按颜色分成两类,就是一个二分图。
题解代码:
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 攻击装置 (二分图匹配)的更多相关文章
- 洛谷P4304 [TJOI2013]攻击装置 题解
题目链接: https://www.luogu.org/problemnew/show/P4304 分析: 最大独立集 最大独立集=总点数-最大匹配数 独立集:点集,图中选一堆点,这堆点两两之间没有连 ...
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...
- 洛咕 P4304 [TJOI2013]攻击装置
把坐标按照(x+y)%2染色可以发现这是个二分图 二分图最大独立集=点数-最大匹配 于是就是个算匹配的傻逼题了 // luogu-judger-enable-o2 #include<bits/s ...
- [TJOI2013] 攻击装置 - 二分图匹配
给定 \(N \times N\) 棋盘,某些格子是障碍,问可以放置的互不侵犯的马的个数 黑白染色后建立二分图,求最大独立集 = 总点数 - 最大匹配数 注意把反边也连上会WA掉(脑抽一发血) #in ...
- BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集
题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...
- BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...
- 洛谷 P3386 【模板】二分图匹配
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...
- P4304 [TJOI2013]攻击装置 最小割
$ \color{#0066ff}{ 题目描述 }$ 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照"日"字攻击其周围的8个位置(x-1, ...
- 洛谷—— P3386 【模板】二分图匹配
P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每 ...
随机推荐
- Java开发学习(十七)----AOP案例之测量业务层接口执行效率
一.需求分析 这个需求比较简单 需求:任意业务层接口执行均可显示其执行效率(执行时长) 这个的目的是查看每个业务层执行的时间,这样就可以监控出哪个业务比较耗时,将其查找出来方便优化. 具体实现的思路: ...
- Modbus的设备怎么对接华为云 使用金鸽BL100只需要5步
BL100是一款高性价比的Modbus转MQTT网关支持一键对接阿里云.华为云. BL100将Modbus串口设备的数据上传至华为云只需要简单五步 第一步.首先将Modbus的设备通过RS485接上M ...
- 【ASP.NET Core】选项类的依赖注入
咱们继续上一个话题.先简单复习一下,根据老周前面文章的介绍,选项类体系的基本套路是通过 IOptionsFactory 来创建选项类实例的.而我们在服务容器(IServiceCollection)上是 ...
- SQLServer查询进程与死锁语句
查询当前进程信息: SELECTSPID = er.session_id,Status = ses.status,[Login] = ses.login_name,Host = ses.host_na ...
- 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...
- NetCore路由的Endpoint模式
IdentityServer里有各种Endpoint,如TokenEndpoint,UserInfoEndpoint,Authorize Endpoint,Discovery Endpoint等等.E ...
- Word 文字多选方式有哪些?
Ctrl + 鼠标左键:不连续地选择文字. Shift + 鼠标左键:连续地选择文字. Alt + 鼠标左键:自由选择文字.
- Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 关于stm32f10xRB系列的PB5和PB12外设冲突问题
上周在公司做了一个项目,调试一个mcu,本以为很简单的调试一下裸机驱动,但是调试过程中遇到了一些问题让我觉得比较有意思,记录一下. 1.关于stm32的SMBUS功能的介绍 由于笔者也没有玩过 ...
- Java数据类型扩展及面试题讲解
这是关于数据类型的面试题,还是比较重要的. 1.整数拓展: 我们肯定都或多或少知道一个问题,叫进制问题.咱们常见的电脑里的二进制,然后咱们平时生活中用的是十进制,然后咱们工作的时候还有一个十六进制跟八 ...