AcWing P378 骑士放置 题解
Analysis
这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置)。然后就跑一遍匈牙利算法就好了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 110 6 using namespace std; 7 inline int read() 8 { 9 int x=0; 10 bool f=1; 11 char c=getchar(); 12 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 13 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 14 if(f) return x; 15 return 0-x; 16 } 17 inline void write(int x) 18 { 19 if(x<0){putchar('-');x=-x;} 20 if(x>9)write(x/10); 21 putchar(x%10+'0'); 22 } 23 struct node 24 { 25 int to,nex; 26 }edge[20*(maxn*maxn+10)]; 27 int n,m,t,cnt,ans; 28 int head[20*(maxn*maxn+10)],match[20*(maxn*maxn+10)]; 29 bool map[maxn*10][maxn*10],book[20*(maxn*maxn+10)]; 30 int dir1[10]={0,1,-1,1,-1,2,-2,2,-2},dir2[10]={0,2,2,-2,-2,1,1,-1,-1}; 31 inline void add(int x,int y) 32 { 33 cnt++; 34 edge[cnt].to=y; 35 edge[cnt].nex=head[x]; 36 head[x]=cnt; 37 } 38 inline bool dfs(int u) 39 { 40 for(int i=head[u];i;i=edge[i].nex) 41 { 42 int v=edge[i].to; 43 if(!book[v]) 44 { 45 book[v]=1; 46 if(!match[v]||dfs(match[v])) 47 { 48 match[v]=u; 49 return true; 50 } 51 } 52 } 53 return false; 54 } 55 inline int calculation(int x,int y){return m*(x-1)+y;} 56 int main() 57 { 58 n=read();m=read();t=read(); 59 for(int i=1;i<=t;i++) 60 { 61 int x,y; 62 x=read();y=read(); 63 map[x][y]=1; 64 } 65 for(int i=1;i<=n;i++) 66 for(int j=1;j<=m;j++) 67 if(!map[i][j]) 68 { 69 for(int k=1;k<=8;k++) 70 { 71 int mi=i+dir1[k],mj=j+dir2[k]; 72 if(mi>0&&mj>0&&mi<=n&&mj<=m&&!map[mi][mj]&&(mi+mj)%2==1) 73 { 74 add(calculation(i,j),calculation(mi,mj)); 75 } 76 } 77 } 78 for(int i=1;i<=calculation(n,m);i++) 79 { 80 memset(book,0,sizeof(book)); 81 if(dfs(i))ans++; 82 } 83 write(n*m-ans-t); 84 return 0; 85 }
请各位大佬斧正(反正我不认识斧正是什么意思)
转载于:https://www.cnblogs.com/handsome-zyc/p/11248580.html
AcWing P378 骑士放置 题解相关推荐
- AcWing 378. 骑士放置 题解
原题链接 题目描述 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照 ...
- Acwing 378.骑士放置(二分图的最大独立集)
Acwing 378.骑士放置 题意 给定一个 N×M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马 ...
- AcWing 378. 骑士放置(最大独立集)
题目 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日 ...
- Acwing 378. 骑士放置
题目描述: 给定一个 N×M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照&quo ...
- `Algorithm-Solution` `AcWing` 378. 骑士放置
link Solution If we add the edge a−ba-ba−b where if a=(x,y)a=(x,y)a=(x,y) then bbb is the endpoint i ...
- 378 骑士放置(最大独立集)
1. 问题描述: 给定一个 N×M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照&q ...
- 二分图——骑士放置(最大独立集)
骑士放置 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照" ...
- 骑士放置 Page435 最大独立集
骑士放置 Page435 最大独立集 棋盘问题首先黑白染色 马移动的曼哈顿距离是3,必然是从白走到黑或者从黑走到白 这题折腾了俩小时,就因为递归那里懒得写int,直接用了个全局变量,根本检查不出来,人 ...
- 算法竞赛进阶指南 骑士放置
4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...
最新文章
- 1.4 微生物对人类社会的影响
- Linux下tomcat内存溢出分析及优化
- 与Brian Goetz聊Java的数据类
- 插入排序 链表 java_JAVA单链表(多项式)直接插入排序,大家看看我的怎么不行呢...
- 修改使用计算机的名称,Windows 10中修改计算机名称的方法,你知道几种?
- c++错误functional:1526:9: error: no type named ‘type’ in ‘class std::result_of
- web 三联发票针式打印_不要买二手激光打印机,公开咸鱼卖家套路
- QT5开发及实例学习之九基本对话框(二)
- 自己定义控件-仿iphone之ToggleButtonamp;VoiceSeekBar
- kaggle入门题Titanic
- Java开发笔记(八十六)通过缓冲区读写文件
- 关于VS2005安装项目制作的三个参考文章链接
- ios App内评价问题
- 最新修复版电影网站源码_2021版米酷影视v7.2.1源码 修复幻灯片 分类网址错误
- 计算机控制的液压提升,LSD液压提升系统(2008).doc
- Win10家庭版使用gpedit.msc方法
- 台式机创建文件服务器,如何将台式机做成云存储服务器
- gym 101908C Pizza Cutter (逆序对)
- 装机出现“我们检测到您的硬盘是GPT格式但未找到ESP分区”解决方法
- 养什么最赚钱成本最低?盘点几个合适的项目!