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代码

最新文章

  1. Android事件分发机制浅谈(一)
  2. A ship is always safe at the shore - but that is not what it is built for.
  3. drozer unknown module处理办法
  4. rockmongo用法
  5. SpringServletContext简单案例
  6. USB DATA Toggle
  7. Linux进程管理知识整理
  8. 对比AppScan Source和Fortify扫描AltoroJ的结果
  9. 同一台电脑启动两个或多个tomcat
  10. IOS-时间与字符串互相转换
  11. 6月19日 NSFileHandle文件类的常用方法
  12. 如何设置静态IP
  13. MySQL插入更新_ON DUPLICATE KEY UPDATE
  14. TypeScript作业
  15. Python全栈之路----函数进阶----作用域的查找空间
  16. python demjson
  17. AtCoder Beginner Contest 087 (ABC)
  18. vue-router 不重新加载问题
  19. java-接口的成员特点
  20. Nginx如何设置禁止IP访问网站

热门文章

  1. 转:Linux 文件IO理解
  2. linux 备份最近一天的文件
  3. fastjson对Date类型的格式化
  4. myeclipse工程更新后java图标变为空心的解决办法
  5. leetcode 238 &amp; leetcode 152 &amp; leetcode 228
  6. [编织消息框架][传输协议]sctp简单开发
  7. linux平台进行c语言源码安装
  8. 渗透神器----BurpSuite_pro_v2.1
  9. java 异常捕获小记
  10. CentOS 7 忘记root密码的修改方法