题目链接:点击查看

题目大意:给出一个n*m的棋盘,有t个点是禁止放棋子的,现在按照马走日的规则,问在互不影响的情况下最多能放多少个马

题目分析:这里首先简单介绍一下二分图最大独立集的定义:

通俗来讲,图的独立集就是“任意两点之间都没有边相连”的点集。包含点数最多的一个就是图的最大独立集

公式:

顶点数-最大匹配数

这样一来,因为马走日的规则也满足奇偶拆点的规则,所以在这个题目中我们可以奇偶建边,然后按照公式计算就好了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;const int b[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};int can[N][N];int num1[N][N],num2[N][N],cnt1,cnt2;vector<int>node[N*N];int match[N*N];bool vis[N*N];bool dfs(int x)
{for(auto y:node[x]){if(!vis[y]){vis[y]=true;if(!match[y]||dfs(match[y])){match[y]=x;return true;}}}return false;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m,t;scanf("%d%d%d",&n,&m,&t);for(int i=1;i<=t;i++){int x,y;scanf("%d%d",&x,&y);can[x][y]=true;}for(int i=1;i<=n;i++)//奇偶拆点for(int j=1;j<=m;j++){if(can[i][j])continue; if((i+j)&1)num1[i][j]=++cnt1;elsenum2[i][j]=++cnt2;}for(int i=1;i<=n;i++)//建边for(int j=1;j<=m;j++){if(can[i][j])continue;for(int k=0;k<8;k++){int xx=i+b[k][0];int yy=j+b[k][1];if(xx<=0||yy<=0||xx>n||yy>m)continue;if(can[xx][yy])continue;if((i+j)&1)node[num1[i][j]].push_back(num2[xx][yy]);elsenode[num1[xx][yy]].push_back(num2[i][j]);}}int ans=n*m-t;//注意这里,顶点数是n*m-t,一开始傻傻的设置成n,wa了好几发for(int i=1;i<=cnt1;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans--;}printf("%d\n",ans);return 0;
}

CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)相关推荐

  1. 骑士放置 Page435 最大独立集

    骑士放置 Page435 最大独立集 棋盘问题首先黑白染色 马移动的曼哈顿距离是3,必然是从白走到黑或者从黑走到白 这题折腾了俩小时,就因为递归那里懒得写int,直接用了个全局变量,根本检查不出来,人 ...

  2. 二分图——骑士放置(最大独立集)

    骑士放置 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照" ...

  3. CH - 6801 棋盘覆盖(二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*n的棋盘,我们需要尽可能多地放置1*2大小的方块,有一些位置是不允许摆放的,问最多能放多少方块 题目分析:看到1*2大小的方块,就直接联想到之前状压dp的那个 ...

  4. 378 骑士放置(最大独立集)

    1. 问题描述: 给定一个 N×M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照&q ...

  5. 骑士放置(最大独立集)

    思路:在位置x,y上走日字形,x+y+跳跃点坐标必定会从奇数变成偶数或者偶数变成奇数,可以形成一个二分图,不相互攻击就是点之间没有边,求最多的点之间没有边相连就是求最大独立集.二分图中最大独立集=点数 ...

  6. AcWing 378. 骑士放置(最大独立集)

    题目 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日 ...

  7. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...

  8. [二分图最大独立集] BZOJ4808:马

    棋盘01染色,然后把互相能打到的点连边,发现是个二分图. 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手- #include<cstdio> #include<que ...

  9. Acwing 378.骑士放置(二分图的最大独立集)

    Acwing 378.骑士放置 题意 给定一个 N×M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马 ...

最新文章

  1. (tomcat访问不了的两种解决方法)Bad Request(Invalid Hostname)
  2. 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
  3. 在JSP页面中显示List集合·
  4. CentOS 5.10安装Oracle 11G R2
  5. gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
  6. matlab循环遍历数组_MatLab简易教程 #8 循环
  7. 【高并发】JUC底层工具类Unsafe
  8. GNU:GCC -O 优化等级
  9. storm中的乐器 wolven_Wolven Storm 风雪狼踪
  10. 你是不是 可替代的Linux运维工程师?
  11. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明
  12. Javascript 笔记(2)----闭包
  13. 我必须得告诉大家的 MySQL 优化原理
  14. Java的继承 以学生管理系统为例
  15. The Podfile (Podfile 的写法和规范)
  16. Unity 动态修改鼠标指针
  17. 银联支付证书下载及导出流程(带图)
  18. 看工业4.0道路上,美国和德国的不同路径
  19. TensorFlow中CNN的两种padding方式“SAME”和“VALID”
  20. 长翅膀的不一定是天使

热门文章

  1. Nginx使用openssl生成证书文件
  2. jdk8中对HashMap做了哪些改变?
  3. Spring5的核心容器
  4. Elastic-Job功能特性
  5. 分布式事务中的Base理论
  6. Bean的依赖注入概念
  7. 获取class文件对象三种方式
  8. 常用的函数式接口_Predicate接口_默认方法and
  9. 防盗链技术底层实现原理分析
  10. html桌面刷新,桌面不能自动刷新怎么办