展开

题目描述

在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入

对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击

输入格式

第一行有 2 个正整数n 和 m (1<=n<=200, 0<=m<n2),分别表示棋盘的大小和障碍数。接下来的 m 行给出障碍的位置。每行 2 个正整数,表示障碍的方格坐标。

输出格式

将计算出的共存骑士数输出

输入输出样例

输入


 输出:


思路:本题显然不存在唯一一行对应唯一一列(車的放置)的关系,那么我们将每个“日”字的对角线进行连接 表示这两个端点无法共存。原题转化为:如何去掉最少的点,去掉所有的边

等效于点数-最小点覆盖。那么引出:最大独立集=n-最小点覆盖

类似于【Asteroids POJ - 3041 【最小点覆盖集】】的思想。先求出除了障碍物以外每一个点所能到达的点【到达的点不能是障碍物】。然后在两个相互能到达的点集中 求最小点覆盖{即删掉最小的点使得删掉所有的边【套模板】 }(求出的答案  注意 ans/2   因为是相互的)。然后再套公式:最大独立集=n-最小点覆盖即可。

AC代码:

 #include<bits/stdc++.h>

 //最大独立集=n-最小点覆盖
using namespace std;
#define maxn 666
int dx[]={,,,,-,-,-,-};
int dy[]={,-,,-,,-,,-};
int mp[maxn][maxn];
int match[*];
int vis[*];
vector<int> v[**];
int num[maxn][maxn];
int flag=;
int n,m;
int head[maxn*maxn];
inline int read(){
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' & c <= '') x = x * + c - '', c = getchar();
return x * f;
}
struct Edge{
int to,next;
}e[**];
void add(int u,int v){
flag++;
e[flag].to=v;
e[flag].next=head[u];
head[u]=flag;
}
int dfs(int u){
for(int i=head[u];i;i=e[i].next){
int temp=e[i].to;
if(!vis[temp]){
vis[temp]=;
if(match[temp]==||dfs(match[temp]))
{
match[temp]=u;
return ;
}
}
}
return ;
}
void ok(int x,int y){
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>&&ty>&&tx<=n&&ty<=n&&!mp[tx][ty]){
//v[num[x][y]].push_back(num[tx][ty]);
//v[num[tx][ty]].push_back(num[x][y]);
add(num[x][y],num[tx][ty]);
add(num[tx][ty],num[x][y]);
}
}
}
int main(){
//int n,m;
//scanf("%d%d",&n,&m);
n=read();
m=read();
for(int i=;i<=m;i++){
int x,y;
//scanf("%d%d",&x,&y);
x=read();y=read();
mp[x][y]=;// 标记不可以走到的点
}
int cnt=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
num[i][j]=++cnt; // 给每一个点编号
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(mp[i][j])
continue;
else{
ok(i,j);
}
}
}
//memset(match,0,sizeof(match));
int ans=;
for(int i=;i<=cnt;i++){
// memset(vis,0,sizeof(vis));
for(int i=;i<=cnt;i++)
vis[i]=;
if(dfs(i))
ans++;
}
int res=n*n-m-ans/;
printf("%d\n",res);
return ;
}

P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图的更多相关文章

  1. 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...

  2. P3355 骑士共存问题

    P3355 骑士共存问题 题目描述 在一个 n*n (n <= 200)个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n ...

  3. P3355 骑士共存问题 二分建图 + 当前弧优化dinic

    P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...

  4. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  5. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  6. P3355 骑士共存问题 网络流

    骑士共存 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最 ...

  7. Luogu P3355 骑士共存问题

    题目链接 \(Click\) \(Here\) 二分图最大独立集.对任意两个可以相互攻击的点,我们可以选其中一个.对于不会互相攻击的,可以全部选中.所以我们只需要求出最大匹配,根据定理,二分图最大独立 ...

  8. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  9. 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国

    洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...

随机推荐

  1. python多任务基础

    1.多任务:两个程序段同时运行2.为某个函数创建线程并启动: import threading 线程名 = threading.Thread(target = 函数名,args = 参数元组) #创建 ...

  2. [Tensorflow]激励函数tf.nn.relu样例

    代码: import tensorflow as tf import numpy as np ### 定义添加神经网络层函数 START ### def add_layer(inputs,in_siz ...

  3. 基于搜索的贝叶斯网络结构学习算法-K2

    基于搜索的贝叶斯网络结构学习算法-K2 2018-04-05 19:34:18 ItsBlue 阅读数 3172更多 分类专栏: 贝叶斯网络 网络结构学习   版权声明:本文为博主原创文章,遵循CC ...

  4. MD5加密处理

    无论传送过程和存储方式,都是以明文的方式,很不安全!一旦泄漏,将会造成很大的损失! 插件名称jQuery.MD5.js: /** * jQuery MD5 hash algorithm functio ...

  5. 转------深入理解--Java按值传递和按引用传递

    引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...

  6. IDEA安装及默认配置习惯配置(一)

    最新新转战IDEA,每次安装完需要做一些操作习惯的设置,在这里记录一下,下次安装可以快速上手用. 第一步,JAVA安装 JDK官方下载地址:https://www.oracle.com 下载JDK时根 ...

  7. 空a标签在IE下无效之解决方法

    过程就不分析了,只说解决方法: 1.给a标签添加样式:background:url(about:blank); 2.给a标签随便添加背景色或者背景图片,然后将a标签的透明度设置为0,不过在IE中需要使 ...

  8. 基2时抽8点FFT的matlab实现流程及FFT的内部机理

    前言 本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好, 还是老实调IP吧,了解内部机理即可,无需重复发明轮子. 参考 https:// ...

  9. Android开发中UI相关的问题总结

    UI设计和实现是Android开发中必不可少的部分,UI做不好的话,丑到爆,APP性能再好,估计也不会有多少人用吧,而且如果UI和业务代码逻辑中间没有处理好,也会很影响APP的性能的.稍微总结一下,开 ...

  10. Linux服务器centos7系统下搭建Jenkins

    Jenkins是什么? Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建.部署.自动化, 满足任何项目的需要. 所以现在是越来越多的公司都在使用Jenkins做持续 ...