Codevs1922 骑士共存问题
2024-09-06 15:30:06
1922 骑士共存问题
题目描述 Description
在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘
上某些方格设置了障碍,骑士不得进入。
对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑
士,使得它们彼此互不攻击。
输入描述
Input Description
第一行有2 个正整数n 和m (1<=n<=200, 0<=m<n^2),
分别表示棋盘的大小和障碍数。接下来的m 行给出障碍的位置。每行2 个正整数,表示障
碍的方格坐标。
输出描述
Output Description
将计算出的共存骑士数输出
样例输入
Sample Input
3 2
1 1
3 3
样例输出
Sample Output
5
数据范围及提示
Data Size & Hint
详见试题
【题解】
卡了半天常还是卡不过去,等以后再用Dinic写吧
先进行黑白染色(此类问题常用),不难发现骑士
只会从黑->白或白->黑,因此我们令X集合为黑,
Y集合为白,从黑->白则连一条边(给黑白格子编
号),
然后找最大独立集即可。注意总的节点数
是没有障碍的
点,做最大匹配的时候也要用没有
障碍的格子的染色
编号。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> inline void read(int &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '') c = ch, ch = getchar();
while(ch <= '' && ch >= '') x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const int MAXN = + ;
const int dx[] = {,-,,-,,-,,-};
const int dy[] = {,-,,-,-,,-,}; int gg[MAXN][MAXN], b[MAXN][MAXN], n, m, lk[],bb[]; struct Edge
{
int u,v,next;
Edge(int _u, int _v, int _next){u = _u;v = _v;next = _next;}
Edge(){}
}edge[]; int head[]; int dfs(int u)
{
for(int pos = head[u];pos;pos = edge[pos].next)
{
int v = edge[pos].v;
if(bb[v])continue;
bb[v] = ;
if(lk[v] == - || dfs(lk[v]))
{
lk[v] = u;
return ;
}
}
return ;
} int xiongyali(int white)
{
int ans = ;
memset(lk, -, sizeof(lk));
for(register int i = ;i <= white;++i)
{
memset(bb, , sizeof(bb));
ans += dfs(i);
}
return ans;
} int main()
{
read(n), read(m);
register int black, white, i;
for(i = ;i <= m;++ i)
{
read(black), read(white);
b[black][white] = ;
}
//X集合:1 白色 Y集合:0 黑色
black = white = ;
for(i = ;i <= n;++ i)
for(int j = ;j <= n;++ j)
if(!b[i][j])
if((i + j)&) gg[i][j] = ++ black;
else gg[i][j] = ++ white;
register int xx, yy, cnt = ;
for(i = ;i <= n;++ i)
for(int j = ;j <= n;++ j)
if(!((i + j)&) && !b[i][j])
for(int k = ;k < ;++ k)
{
xx = i + dx[k], yy = j + dy[k];
if(xx <= || yy <= || xx > n || yy > n || b[xx][yy])continue;
yy = gg[xx][yy], xx = gg[i][j];
edge[++cnt] = Edge(xx,yy,head[xx]);
head[xx] = cnt;
}
printf("%d", white + black - xiongyali(white));
return ;
}
90分TLE代码
最新文章
- Android事件分发机制浅谈(一)
- A ship is always safe at the shore - but that is not what it is built for.
- drozer unknown module处理办法
- rockmongo用法
- SpringServletContext简单案例
- USB DATA Toggle
- Linux进程管理知识整理
- 对比AppScan Source和Fortify扫描AltoroJ的结果
- 同一台电脑启动两个或多个tomcat
- IOS-时间与字符串互相转换
- 6月19日 NSFileHandle文件类的常用方法
- 如何设置静态IP
- MySQL插入更新_ON DUPLICATE KEY UPDATE
- TypeScript作业
- Python全栈之路----函数进阶----作用域的查找空间
- python demjson
- AtCoder Beginner Contest 087 (ABC)
- vue-router 不重新加载问题
- java-接口的成员特点
- Nginx如何设置禁止IP访问网站