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 # ...
随机推荐
- RPC与Zookeeper注册中心的简单实现
连接上文:https://www.cnblogs.com/wuzhenzhao/p/9962250.html RPC框架的简单实现,基于这个小程序,在我学习完Zookeeper之后如何将注册中心与RP ...
- 【JS小技巧】JavaScript 函数用作对象的隐藏问题(F.ui.name)
用户反馈 @消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错: 因为这是一个 ASP.NET MVC 的 ...
- FineUI经典项目展示(1)生产在线管理系统
本系列<FineUI经典项目展示>文章将会集中展示一批使用FineUI(开源版).专业版.MVC版的经典项目. 如果你希望自己的FineUI项目出现在这个舞台,请到官网论坛提交申请: ht ...
- 自己制作Chrome便携版实现多版本共存
本文只针对Windows下的Chrome浏览器的使用. 有时候我们需要使用老版本Chrome,或者仅仅体验一下最新版. 上古时代有IETester用来测试多个IE版本,和本机的IE不冲突. Chrom ...
- Omi教程-组件通讯攻略大全
组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...
- Vue(二)基础
01-vue的起步 1.引包 a) 直接下载,并用<script>标签引入 b) CDN方式引入: <script src="https://cdn.bootcss.com ...
- 三、临时弹出一个QQ对话窗口
第一种:需要添加好友才可以访问 <a href="http://wpa.qq.com/msgrd?v=3&uin=317985559&site=qq&menu= ...
- pycharm 报错:pycharm please specify a different SDK name
我在给项目配虚拟环境里的解释器的时候有没有遇到过这个问题的啊,就是一个正常的项目,解释器忽然丢了,解释器是配在虚拟环境里面的,再去选择解释器就一直报这个错,给现有项目添加虚拟环境的时候也是报这个错—— ...
- HDU - 1698 线段树区间修改,区间查询
这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...
- Java Profiling & Profilers
A Guide to Java Profilers | Baeldunghttps://www.baeldung.com/java-profilers 常用 Java Profiling 工具的分析与 ...