展开

题目描述

在一个 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. pandas数据结构之DataFrame笔记

    DataFrame输出的为表的形式,由于要把输出的表格贴上来比较麻烦,在此就不在贴出相关输出结果,代码在jupyter notebook可以顺利运行代码中有相关解释用来加深理解方便记忆 import ...

  2. Luogu4081 USACO17DEC Standing Out from the Herd(广义后缀自动机)

    建出广义SAM,通过parent树对每个节点求出其是否仅被一个子串包含及被哪个包含. 写了无数个sam板子题一点意思都没啊 #include<bits/stdc++.h> using na ...

  3. hdu 1285 拓扑

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. SQL Server系统函数:日期函数

    原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...

  5. [书籍翻译] 《JavaScript并发编程》第四章 使用Generators实现惰性计算

    本文是我翻译<JavaScript Concurrency>书籍的第四章 使用Generators实现惰性计算,该书主要以Promises.Generator.Web workers等技术 ...

  6. 基于vue的购物车清单

    <!doctype html> <html> <head> <meta charset="utf-8"> <link rel= ...

  7. Cryptography -- 密码学

    Introduction to Cryptography Cryptography enables you to store sensitive information or transmit it ...

  8. solr8.2 环境搭建 配置中文分词器 ik-analyzer-solr8 详细步骤

    一.下载安装Apache Solr 8.2.0 下载地址:http://lucene.apache.org/solr/downloads.html 因为是部署部署在windows系统上,所以下载zip ...

  9. 共用dll如何扩展

    今天需要对一个多个项目共用的dll进行扩展.发现很难搞,然后老大告诉我共享的dll有一个属性指向各个平台自己的类型,这个类型是暴露在各个平台自己项目中的. 然后直接对这个属性进行扩展就行了,这个属性是 ...

  10. PrintWriter返回乱码的分析及解决

    用response得到输出流,即response.getOuptStream(); 返回值为ServletOutputStream 对象,即JSP的out对象,要么用response得到输出对象Pri ...