传送门

因为骑士只能走"日"字,所以一定是从一个奇点到偶点或偶点到奇点,那么这就是一张二分图,题目要求的其实就是二分图的最大独立集。最大独立集=n-最大匹配。

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
const int MAXN = *;
//const int MAXM = 205*205;
const int MAXM = *MAXN; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int xx[]={,,-,-,-,-,,},yy[]={,,,,-,-,-,-};
int n,m,head[MAXN],cnt,vis[MAXN],match[MAXN];
int to[MAXM<<],nxt[MAXM<<],num,ans;
bool ban[][]; inline void add(int bg,int ed){
// cout<<bg<<" "<<ed<<endl;
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
} inline void bfs(int x,int y){
for(register int i=;i<=;i++){
int ii=xx[i]+x,jj=yy[i]+y;
if(ii< || ii>n || jj< || jj>n || ban[ii][jj]) continue;
add((x-)*n+y,(ii-)*n+jj);
}
} bool dfs(int x){
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u]==num) continue;
vis[u]=num;
if(!match[u] || dfs(match[u])) {match[u]=x;return true;}
}
return false;
} int main(){
n=rd(),m=rd();int x,y;
for(register int i=;i<=m;i++){
x=rd(),y=rd();
ban[x][y]=;
}
for(register int i=;i<=n;i++)
for(register int j=(+((i-)&));j<=n;j+=)
if(!ban[i][j]) bfs(i,j);
for(register int i=;i<=n;i++)
for(register int j=(+((i-)&));j<=n;j+=)
if(!ban[i][j]) num++,ans+=dfs((i-)*n+j);
cout<<(n*n-m)-ans;
return ;
}

LUOGU P3355 骑士共存问题(二分图最大独立集)的更多相关文章

  1. Luogu P3355 骑士共存问题

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

  2. 洛谷P3355 骑士共存问题 二分图_网络流

    Code: #include<cstdio> #include<cstring> #include<queue> #include<vector> #i ...

  3. P3355 骑士共存问题

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

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

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

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

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

  6. P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图

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

  7. 【Luogu】P3355骑士共存问题(最小割)

    题目链接 像题面那样把棋盘染成红黄点.发现骑士迈一步能到达的点的颜色一定是跟他所在的格子的颜色不同的.于是(woc哪来的于是?这个性质有这么明显吗?)从源点向所有红点连边,从所有黄点向汇点连边,红点向 ...

  8. 洛谷P3355 骑士共存问题

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

  9. 洛谷 [P3355] 骑士共存问题

    二分图求最大独立点集 本问题在二分图中已处理过,此处用dinic写了一遍 #include <iostream> #include <cstdio> #include < ...

随机推荐

  1. ADIS16405BMLZ

    GND,VCC,CS,DOUT,SCLK,DIN

  2. 解决ios10及以上Safari双击和双指缩放无法禁止的问题

    移动端web缩放有两种: 1.双击缩放: 2.双指手势缩放. 在iOS 10以前,iOS和Android都可以通过一行meta标签来禁止页面缩放 <meta content="widt ...

  3. Java父类强制转换子类原则

    最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public cl ...

  4. JAVA发展历史!

    前言 自1946年2月14日世界上首款计算机问世,第一代计算机语言“机器语言”便诞生了,它使用的是最原始的穿孔卡片,这种卡片上使用的语言只有专家才能理解,与人类语言差别极大.这种语言本质上是计算机能识 ...

  5. HDU 5726 线段树+dp

    题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同 首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp, dp[i][tmp]表示 ...

  6. 2018湘潭大学程序设计竞赛【D】

    题目链接:https://www.nowcoder.com/acm/contest/105/D 题意:就是数的fib表示方法.按权展开,又按二进制算出结果输出. 题解:贪心和数论吧.找到跟数最接近的f ...

  7. iOS开发系列-weak与unsafe_unretained修饰符

    概述 在iOS内存管理中,为防止循环引用,定义类的内部对象属性使用weak.unsafe_unretained修饰符,不产生强引用. 开发中一般使用的weak修饰符,那么接下来说下weak跟unsaf ...

  8. luaj使用 方法签名规则 Cocos2dxLuaJavaBridge

    function AndroidHandler:getParamJson()     local args = {nil}     local ok,ret = luaj.callStaticMeth ...

  9. webpakc4.0移除了 CommonsChunkPlugin 组建

    在4.0之前我们可以通过 require('webpack.optimize.CommonsChunkPlugin');  这样引入 CommonsChunkPlugin  组建对第三方模块进行独立打 ...

  10. Android开发 SeekBar开发记录

    前言 开发记录博客不是讲解使用博客,更多的是各种功能与点子的记录 基本使用 <SeekBar android:layout_width="match_parent" andr ...