[loj6033]棋盘游戏
将棋盘黑白染色,即构成一张二分图
将状态用一张二分图$G$和一个点$x\in V$描述(分别为仍未被经过的点的导出子图和当前棋子所在位置),并称将要移动棋子的一方为先手
结论:先手必胜当且仅当$x$一定在$G$的最大匹配中
对该结论归纳,显然$|V|\le 2$时显然成立
若$|V|<n$时成立,考虑$|V|=n$时——
若$x$一定在最大匹配中,先手任选一组最大匹配并将棋子移动到匹配的点
注意到将新图(指删去$x$后)的最大匹配数恰比原图少1(否则即存在最大匹配不包含$x$),因此先手所选的最大匹配去掉$x$所在的匹配后也为新图的最大匹配
其并不包含棋子所在的点,根据归纳假设即先手必胜
若$x$不一定在最大匹配中,那么新图的最大匹配数和原图相同
注意到如果新图的最大匹配不包含某个与$x$相邻的点,那么原图的最大匹配就可以在此基础上增加$x$和该点的匹配,即与两者最大匹配数相同矛盾
因此,所有与$x$相邻的点都一定在新图的最大匹配中,根据归纳假设即先手必败
综上,即得证
由此,对其先任求一组最大匹配,不在匹配中的点即一定在答案中,对匹配中的点再对其所匹配的寻找增广路来判断是否一定在最大匹配中
时间复杂度为$o(n^{2}m^{2})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 struct Edge{
5 int nex,to;
6 }edge[N*N*4];
7 int n,m,V,E,tot,id[N][N],head[N*N],vis[N*N],match[N*N],ans[N*N];
8 char s[N][N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 bool dfs(int k){
15 if (vis[k])return 0;
16 vis[k]=1;
17 for(int i=head[k];i!=-1;i=edge[i].nex)
18 if ((!match[edge[i].to])||(dfs(match[edge[i].to]))){
19 match[k]=edge[i].to;
20 match[edge[i].to]=k;
21 return 1;
22 }
23 return 0;
24 }
25 int main(){
26 scanf("%d%d",&n,&m);
27 for(int i=0;i<n;i++){
28 scanf("%s",s[i]);
29 for(int j=0;j<m;j++)
30 if (s[i][j]!='#')id[i][j]=++V;
31 }
32 memset(head,-1,sizeof(head));
33 for(int i=0;i<n;i++)
34 for(int j=0;j<m;j++)
35 if (id[i][j]){
36 if ((i)&&(id[i-1][j])){
37 add(id[i][j],id[i-1][j]);
38 add(id[i-1][j],id[i][j]);
39 }
40 if ((j)&&(id[i][j-1])){
41 add(id[i][j],id[i][j-1]);
42 add(id[i][j-1],id[i][j]);
43 }
44 }
45 for(int i=1;i<=V;i++)
46 if (!match[i]){
47 memset(vis,0,sizeof(vis));
48 dfs(i);
49 }
50 for(int i=1;i<=V;i++)
51 if (!match[i])ans[i]=1;
52 else{
53 memset(vis,0,sizeof(vis));
54 ans[i]=dfs(match[i]);
55 if (ans[i])match[i]=0;
56 }
57 for(int i=0;i<n;i++)
58 for(int j=0;j<m;j++)
59 if ((id[i][j])&&(ans[id[i][j]]))tot++;
60 printf("%d\n",tot);
61 for(int i=0;i<n;i++)
62 for(int j=0;j<m;j++)
63 if ((id[i][j])&&(ans[id[i][j]]))printf("%d %d\n",i+1,j+1);
64 }
[loj6033]棋盘游戏的更多相关文章
- [LOJ6029~6052]雅礼集训 2017 选做
Link 代码可以在loj上看我的提交记录. Day 1 [LOJ6029]市场 对于一次除法操作,若区间内所有数的减少量均相同则可视作区间减法,否则暴力递归下去.显然一个线段树节点只会被暴力递归进去 ...
- LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
什么神仙思路啊-- 看到棋盘就去想二分图.(smg啊)(其实是校内模拟赛有基本一样的题,只不过直接给了个二分图) 看到二分图就去想最大匹配.(我怎么想偶环的性质去了) (以下内容摘自这里) 这个二分图 ...
- HD1281棋盘游戏(匹配+好题)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu------1281 棋盘游戏(最小覆盖点)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1281 棋盘游戏
http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- 洛谷P1117 棋盘游戏
洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...
- UESTC_棋盘游戏 CDOJ 578
最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- Hdu1281 棋盘游戏
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
随机推荐
- mysql从零开始之MySQL UPDATE 更新
MySQL UPDATE 更新 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQ ...
- 基于python的pixiv爬虫
基于python的pixiv爬虫 1.目标 在和朋友吹逼过程中,聊到qq群机器人,突发奇想动手做一个p站每日推荐色图的色图机,遂学习爬虫. 目标: 批量下载首页推荐色图. 由于对qq机器人不熟,先利用 ...
- docker之swarm容器部署及运维
1.概念 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Docker API,所有 ...
- 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%
Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...
- 官宣!ElasticJob 3.0.0 版本正式发布
ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成.它通过弹性调度.资源管控.以及 ...
- 【学习转载】MyBatis源码解析——日志记录
声明:转载自前辈:开心的鱼a1 一 .概述 MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,但MyBatis统一提供了trace.deb ...
- Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)
个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...
- csp总结 (差点爆零的总结)
T1,iterator忘了怎么写了,想了很久都想不出来有什么可以替代,只好O(n^2): T2,不会,只会打暴力 T3,自以为是正解,写了很久大概3h,却一直过不了大样例,大样例输出全是0: T4,不 ...
- 2021.10.9考试总结[NOIP模拟72]
T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...
- 单片机stm32的5个时钟源的详细分析
众所周知STM32有5个时钟源HSI.HSE.LSI.LSE.PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的. 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低 ...