P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图
题目描述
在一个 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 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图的更多相关文章
- 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...
- P3355 骑士共存问题
P3355 骑士共存问题 题目描述 在一个 n*n (n <= 200)个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n ...
- P3355 骑士共存问题 二分建图 + 当前弧优化dinic
P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...
- 洛谷 P2791 幼儿园篮球题
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...
- 洛谷 P2220 [HAOI2012]容易题 数论
洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...
- P3355 骑士共存问题 网络流
骑士共存 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最 ...
- Luogu P3355 骑士共存问题
题目链接 \(Click\) \(Here\) 二分图最大独立集.对任意两个可以相互攻击的点,我们可以选其中一个.对于不会互相攻击的,可以全部选中.所以我们只需要求出最大匹配,根据定理,二分图最大独立 ...
- 在洛谷3369 Treap模板题 中发现的Splay详解
本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...
- 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国
洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...
随机推荐
- css — 选择器、盒子模型
目录 1. css引入方式 2. css选择器 3. css的盒模型 css: 层叠样式表 1. css引入方式 行内样式 <div style='color:red;'>mjj</ ...
- 使用内存地址点亮LED—跟51单片机一样写代码教学(初步入门)
51单片机点亮一个小灯 #include <rge52.h> sbit LED = P0^ void main(void) { P0 = 0XFE; // 总线操作 sfr P0 0X80 ...
- SAS学习笔记34 指针控制
指针控制符分为行指针和列指针两种 列指针控制符模式 @n:指明列的开始位置,是对应变量的数据开始列位置 列控制符号模式 n1-n2:n1列开始位置,n2列结束位置 @与@@符号应用 @行控制符号,控制 ...
- archive_lag_target参数
需求,由于一套生产环境归档日志切换频率过低,建议修改参数,使其间隔一定时间周期自动切换生成归档日志; SQL>; THREAD# SEQUENCE# TO_CHAR(COMPLETION_TIM ...
- (三十)JSP标签之自定义标签
创建一个类,引入外部jsp-api.jar包(在tomcat 下lib包里有),这个类继承SimpleTagSupport 重写doTag()方法. jspprojec包下的helloTag类: 1 ...
- (六)maven之常用插件
一.maven的插件 maven官方插件:http://maven.apache.org/plugins/index.html 二.常用插件之:javadoc 作用:生成代码文档 2.1 编写代码,并 ...
- SqlServer 多服务器管理配置报错:Ensure the agent startup account for 'x.x.x.x' has rights to login as target server, Access is denied.
SQL Server 2012配置多服务器管理时,SSMS设置一直报错,配置失败: 解决方法: 1. 为SQL Server Agent单独创建一个账号,主服务器和目标服务器都创建一样的账号 2. 把 ...
- wstngfw中配置snort
wstngfw中配置snort 概述 Snort是入侵检测和预防系统.它可以将检测到的网络事件记录到日志并阻止它们.Snort使用称为规则的检测签名进行操作. Snort规则可以由用户自定义创建,或者 ...
- Linux基本命令 vi操作和插件
基本命令 vim命令 常用插件 基本命令 查看Tomcat日志: tail -n 20 -f catalina.out 查看指定列表: find ./ -name 'ser*' 搜索指定文件: loc ...
- Django rest-framework框架-组件之渲染器
渲染器: from rest_framework.renderers import BrowsableAPIRenderer,AdminRenderer,HTMLFormRenderer,JSONRe ...