AcWing P378 骑士放置 题解
Analysis
这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置)。然后就跑一遍匈牙利算法就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
struct node
{
int to,nex;
}edge[*(maxn*maxn+)];
int n,m,t,cnt,ans;
int head[*(maxn*maxn+)],match[*(maxn*maxn+)];
bool map[maxn*][maxn*],book[*(maxn*maxn+)];
int dir1[]={,,-,,-,,-,,-},dir2[]={,,,-,-,,,-,-};
inline void add(int x,int y)
{
cnt++;
edge[cnt].to=y;
edge[cnt].nex=head[x];
head[x]=cnt;
}
inline bool dfs(int u)
{
for(int i=head[u];i;i=edge[i].nex)
{
int v=edge[i].to;
if(!book[v])
{
book[v]=;
if(!match[v]||dfs(match[v]))
{
match[v]=u;
return true;
}
}
}
return false;
}
inline int calculation(int x,int y){return m*(x-)+y;}
int main()
{
n=read();m=read();t=read();
for(int i=;i<=t;i++)
{
int x,y;
x=read();y=read();
map[x][y]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(!map[i][j])
{
for(int k=;k<=;k++)
{
int mi=i+dir1[k],mj=j+dir2[k];
if(mi>&&mj>&&mi<=n&&mj<=m&&!map[mi][mj]&&(mi+mj)%==)
{
add(calculation(i,j),calculation(mi,mj));
}
}
}
for(int i=;i<=calculation(n,m);i++)
{
memset(book,,sizeof(book));
if(dfs(i))ans++;
}
write(n*m-ans-t);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
AcWing P378 骑士放置 题解的更多相关文章
- 「CH6901」骑士放置
「CH6901」骑士放置 传送门 将棋盘黑白染色,发现"日"字的两个顶点刚好一黑一白,构成一张二分图. 那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑.白点连边. 当 ...
- 【CH6901】骑士放置
题目大意:给定一个 N*M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照" ...
- BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...
- 【日常学习】【IDA*】codevs2449 骑士精神题解
题目描写叙述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1.纵坐标相差为2或 ...
- CH6901 骑士放置
原题链接 和棋盘覆盖(题解)差不多.. 同样对格子染色,显然日字的对角格子是不同色,直接在对应节点连边,然后就是二分图最大独立集问题. #include<cstdio> #include& ...
- BZOJ1085 luogu2324骑士精神题解
没有什么特别好的办法,只好用搜索去做 因为一次移动最多归位一个骑士 所以可以想到用IDA*,为了简化状态 我们用k,x,y,sum来表示移动了k步,空格在x,y,还用sum个没有归位的情况 然后枚举转 ...
- AcWing 195. 骑士精神
双向BFS (广搜) \(O(8 ^ 7)\) 看到没有双向BFS的题解我就过来了 这道题也可以用双向\(BFS\)来做,时间复杂度与\(IDA*\)不相上下. 双向\(BFS\)的实现有多种: 把初 ...
- Acwing P288 休息时间 题解
Analysis 首先假设一天的第N小时与后一天的第一个小时不相连, 这种情况下DP转移比较好想 dp[i][j][0/1]dp[i][j][0/1]表示 考虑一天的前i个小时,已经休息了j小时,且第 ...
- Acwing P274 移动服务 题解
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...
随机推荐
- FZU2018级算法第三次作业 3.16 station
题目大意: 给出1-n共n个数的入栈顺序,可以随时出栈,求出栈的最大字典序. 输入示例 输出示例 51 2 3 4 5 5 4 3 2 1 54 2 5 3 1 5 3 2 4 1 题目分析: 假设目 ...
- 剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位 ...
- show processlist说明
mysql> show processlist; 有时候输出太多,可以用下面的语句代替 mysql> select * from information_schema.processlis ...
- Golang_学习资料
个人推荐: http://godeye.org/index.php?a=course&id=6 http://mikespook.com/learning-go/ http://coolshe ...
- 小游戏UFO Fled
UFO Fled:https://play.google.com/store/apps/details?id=cn.crane.game.flappyufo UFO Fled -- 点击屏幕帮助UFO ...
- PowerBuilder学习笔记之行删除卡死问题
在数据窗口勾选这两个选项后,在删除行数据时会导致系统直接崩溃退出
- WebApi如何传递参数
一 概述 一般地,我们在研究一个问题时,常规的思路是为该问题建模:我们在研究相似问题时,常规思路是找出这些问题的共性和异性.基于该思路,我们如何研究WebApi参数传递问题呢? 首先,从参数本身来说, ...
- nginx修改响应头(可屏蔽后端服务器的信息:IIS,PHP等)
修改nginx反向代理请求的Header 需要使用到proxy_set_header和add_header指令.其中: proxy_set_header 来自内置模块ngx_http_proxy_mo ...
- FFMPEG - ffplay源代码分析
FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制.转换以及流化音视频的解决方案.而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器.学习ffplay ...
- The Art Of Loving
The Art Of Loving 来源 https://www.zhihu.com/question/23720541 ----------------------------- 茫然的蒲公英 有书 ...