CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)
题目链接:点击查看
题目大意:给出一个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 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)相关推荐
- 骑士放置 Page435 最大独立集
骑士放置 Page435 最大独立集 棋盘问题首先黑白染色 马移动的曼哈顿距离是3,必然是从白走到黑或者从黑走到白 这题折腾了俩小时,就因为递归那里懒得写int,直接用了个全局变量,根本检查不出来,人 ...
- 二分图——骑士放置(最大独立集)
骑士放置 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照" ...
- CH - 6801 棋盘覆盖(二分图最大匹配+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*n的棋盘,我们需要尽可能多地放置1*2大小的方块,有一些位置是不允许摆放的,问最多能放多少方块 题目分析:看到1*2大小的方块,就直接联想到之前状压dp的那个 ...
- 378 骑士放置(最大独立集)
1. 问题描述: 给定一个 N×M 的棋盘,有一些格子禁止放棋子.问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照&q ...
- 骑士放置(最大独立集)
思路:在位置x,y上走日字形,x+y+跳跃点坐标必定会从奇数变成偶数或者偶数变成奇数,可以形成一个二分图,不相互攻击就是点之间没有边,求最多的点之间没有边相连就是求最大独立集.二分图中最大独立集=点数 ...
- AcWing 378. 骑士放置(最大独立集)
题目 给定一个 N*M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马",按照"日 ...
- HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...
- [二分图最大独立集] BZOJ4808:马
棋盘01染色,然后把互相能打到的点连边,发现是个二分图. 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手- #include<cstdio> #include<que ...
- Acwing 378.骑士放置(二分图的最大独立集)
Acwing 378.骑士放置 题意 给定一个 N×M 的棋盘,有一些格子禁止放棋子. 问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的"骑士",类似于中国象棋的"马 ...
最新文章
- (tomcat访问不了的两种解决方法)Bad Request(Invalid Hostname)
- 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
- 在JSP页面中显示List集合·
- CentOS 5.10安装Oracle 11G R2
- gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
- matlab循环遍历数组_MatLab简易教程 #8 循环
- 【高并发】JUC底层工具类Unsafe
- GNU:GCC -O 优化等级
- storm中的乐器 wolven_Wolven Storm 风雪狼踪
- 你是不是 可替代的Linux运维工程师?
- 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明
- Javascript 笔记(2)----闭包
- 我必须得告诉大家的 MySQL 优化原理
- Java的继承 以学生管理系统为例
- The Podfile (Podfile 的写法和规范)
- Unity 动态修改鼠标指针
- 银联支付证书下载及导出流程(带图)
- 看工业4.0道路上,美国和德国的不同路径
- TensorFlow中CNN的两种padding方式“SAME”和“VALID”
- 长翅膀的不一定是天使