BZOJ 1443 游戏(二分图博弈)
新知识get。
一类博弈问题,基于以下条件:
1.博弈者人数为两人,双方轮流进行决策。
2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集)。任意合法的决策(对应边)使状态从一类跳转到另一类。(正是由于这个性质使得问题可以用二分图描述)
3.不可以转移至已访问的状态。(不可重复访问点)
4.无法转移者判负。
这类问题相当于从二分图指定起点开始轮流移动,不可重复访问点,无法移动判负 。
现在问题变为从二分图指定起点开始轮流移动,不可重复访问点,无法移动判负。
不妨设起点在二分图的X集中,那么先手只能从X集移动到Y集,后手只能从Y集移动到X集。一次游戏过程对应一条路径 。若最后停留在X集且无法移动则先手负,停留在Y集则后手负。
考虑该二分图的某个最大匹配。(注意可能存在多个匹配相同的最大匹配)
若起点s∈X不属于该最大匹配。则先手所转移到的点y∈Y一定属于最大匹配(否则s-y是一个匹配,与最大匹配矛盾)。后手沿着最大匹配的边走即可,终点t(指无法从t再走一步)一定不可能在Y集中(否则,若t在Y集中,s-...-t为一增广路,与最大匹配矛盾)。因此先手必败,后手必胜。
若起点s∈X属于该最大匹配。则将s从图中删除,再求图的最大匹配。若最大匹配数不变,则s还是不属于某最大匹配,先手必败。否则该图的任意最大匹配都包含s,则先手沿着最大匹配的边走即可,根据上面的分析,先手必胜。
也就是说题目中按棋盘黑白染色构建二分图后,必胜点就是二分图中的所有的最大匹配非必要点。不能直接枚举。会超时。
首先,不构成最大匹配的点一定是非必要点。
其次,对不构成最大匹配的点出发走交错轨可以求出其他的非必要点。
#include<cstdio>
int n,m;
char s[][];
int xs[]={-,,,};
int ys[]={,-,,};
int px[][],py[][],d[][],now,v[][],ed[][];
bool dfs(int x,int y){
d[x][y]=now;
if(px[x][y]&&d[px[x][y]][py[x][y]]!=now)return dfs(px[x][y],py[x][y]);
for(int i=;i<;i++){
int x1=x+xs[i],y1=y+ys[i];
if(d[x1][y1]!=now&&s[x1][y1]=='.'&&!px[x1][y1]){
px[x][y]=x1;py[x][y]=y1;
px[x1][y1]=x;py[x1][y1]=y;
return ;
}
}
for(int i=;i<;i++){
int x1=x+xs[i],y1=y+ys[i];
if(d[x1][y1]!=now&&s[x1][y1]=='.'&&dfs(x1,y1)){
px[x][y]=x1;py[x][y]=y1;
px[x1][y1]=x;py[x1][y1]=y;
return ;
}
}
return ;
}
void dfs2(int x,int y){
if(ed[x][y]||s[x][y]!='.')return;
ed[x][y]=;
v[x][y]=;
for(int i=;i<;i++){
int x1=x+xs[i],y1=y+ys[i];
if(px[x1][y1])dfs2(px[x1][y1],py[x1][y1]);
}
}
int main(){int a=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%s",s[i]+);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(s[i][j]=='.'&&!px[i][j]){
++now;
a+=dfs(i,j);
}
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(s[i][j]=='.'&&!px[i][j])v[i][j]=;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(s[i][j]=='.'&&!px[i][j])dfs2(i,j);
}
}
bool win=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(v[i][j])win=;
}
}
puts(win?"WIN":"LOSE");
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(v[i][j])printf("%d %d\n",i,j);
}
}
return ;
}
BZOJ 1443 游戏(二分图博弈)的更多相关文章
- [NOI2011]兔兔与蛋蛋游戏 二分图博弈
题面 题面 题解 通过观察,我们可以发现如下性质: 可以看做是2个人在不断移动空格,只是2个人能移动的边不同 一个位置不会被重复经过 : 根据题目要求,因为是按黑白轮流走,所以不可能重复经过一个点,不 ...
- [JSOI2009]游戏 二分图博弈
题面 题面 题解 二分图博弈的模板题,只要会二分图博弈就可以做了,可以当做板子打. 根据二分图博弈,如果一个点x在某种方案中不属于最大匹配,那么这是一个先手必败点. 因为对方先手,因此我们就是要找这样 ...
- [luogu1971 NOI2011] 兔兔与蛋蛋游戏 (二分图博弈)
传送门 Solution 补一篇二分图博弈 这个博客写的很详细qwq: https://www.cnblogs.com/maijing/p/4703094.html Code //By Menteur ...
- BZOJ.2437.[NOI2011]兔兔与蛋蛋游戏(二分图博弈 匈牙利)
题目链接 首先空格的移动等价于棋子在黑白格交替移动(设起点移向白格就是黑色),且不会走到到起点距离为奇数的黑格.到起点距离为偶数的白格(删掉就行了),且不会重复走一个格子. (然后策略就同上题了,只不 ...
- bzoj 1854 游戏 二分图匹配 || 并查集
题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...
- luogu4055 游戏 (二分图博弈)
考虑对非障碍的点黑白染色然后做二分图最大匹配,那么有结论,先手必胜当且仅当不是完美匹配,而且可以放的点是那些可以不匹配的点 从非匹配点开始走,后手只能走到匹配点,于是先手就可以走匹配边.由于不能走走过 ...
- BZOJ 1854 游戏(二分图匹配或并查集)
此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个 ...
- [模板] 二分图博弈 && BZOJ2463:[中山市选2009]谁能赢呢?
二分图博弈 from BZOJ 1443 游戏(二分图博弈) - free-loop - 博客园 定义 1.博弈者人数为两人,双方轮流进行决策. 2.博弈状态(对应点)可分为两类(状态空间可分为两个集 ...
- bzoj 1443 二分图博弈
这种两个人轮流走,不能走 走过的格子的大都是二分图博弈... #include<bits/stdc++.h> #define LL long long #define fi first # ...
随机推荐
- 单点登录SSO:概述与示例
目录 概述 演示一:零改造实施单点登录 演示二: 单点注销 演示三:集成AD认证 演示四:客户端单点登录 演示五:移动端单点登录 单点登录SSO概述 本系列将由浅入深的,带大家掌握最新单点登录SSO方 ...
- Quartz.NET 任务调度教程。
https://www.cnblogs.com/yaopengfei/p/9216229.html
- Spring如何加载log4j配置文件
今天有朋友在群里问了这个问题,于是写了这篇文章进行整理. 问题如下: 在项目中添加了log4j.properties配置文件,并没有在Spring配置文件中配置,也没有在web.xml中配置,但是代码 ...
- 【开源】Westore Cloud 发布- 没后端没SQL没DBA,只需 javascript 开发云端小程序
Westore Cloud - 隐形云,NoBackEnd,NoSql,HiddenDB 好的设计便是感觉不到设计的存在 开发小程序,但是:没有后端!没有运维!没有 DBA!没有域名!没有证书!没有钱 ...
- SpringBoot集成Apache Shiro
笔者因为项目转型的原因,对Apache Shiro安全框架做了一点研究工作,故想写点东西以便将来查阅.之所以选择Shiro也是看了很多人的推荐,号称功能丰富强大,而且易于使用.实践下来的确如大多数人所 ...
- IIS6下使用多域名和通配符证书
由于SSL协议,在完成握手以前,都只能采用IP地址通信方式,没有办法获取访问地址中的域名信息,所以针对每个IP地址的每个端口,服务器只能返回相同的一张证书.如果要实现多个不同域名共享一个IP地址的缺省 ...
- 剑指offer--4.重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- python之subprocess模块详解--小白博客
subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模 ...
- H5 详情和概要标签
38-详情和概要标签 概要信息 详情信息 --> 郑伊健 简介:郑伊健,1967年10月4日出生于中国香港,籍贯广东恩平,香港影视演员.流行男歌手.1988年参加新秀歌唱大赛加入无线电视,因拍摄 ...
- POJ - 3468 线段树区间修改,区间求和
由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...