bzoj 2437: [Noi2011]兔兔与蛋蛋
Description
Solution
考虑犯错误的条件:之前是处于必胜状态,该操作之后就变成了必败状态.
我们可以把这个过程看成两人对网格图进行黑白染色,变成了一个二分图模型,即当前位置向相邻不同颜色的位置连边,构成的二分图,一次游戏相当于一个最大匹配.
一个结论:如果一定存在包含当前位置的最大匹配,那么处于先手必胜状态
证明:
因为当前点不处于最大匹配中,那么只有非匹配边可以走,假设走到了\(v\),\(v\)点则可以走匹配边,假设走了一条匹配边,则到达的下一个点只能走非匹配边,因为匹配的点是\(v\), 综上:先手只能一直沿着非匹配边走,而后手有匹配边可以走,所以不是必胜状态
所以只需要判断一个点是否在一定在最大匹配中了
方法是:删除该点,再跑一次最大匹配,如果能成功匹配则不满足条件.
一个细节:一定不会存在回路,即一个点只会走一次,所以走过的点不能再进入匹配中
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=45;
int x,y,nxt[N*N*8],to[N*N*8],num=0,w[N*N];
int n,m,a[N][N],id[N][N],cnt=0;char s[N];
bool vis[N*N],ans[N*N*2];int b[N*N],head[N*N];
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline bool dfs(int x){
for(int i=head[x];i;i=nxt[i]){
int u=to[i];
if(!vis[u] && !w[u]){
vis[u]=1;
if(!b[u] || dfs(b[u])){
b[u]=x;b[x]=u;
return true;
}
}
}
return false;
}
void build(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(((i+j)&1)^((x+y)&1)^(a[i][j]==1))
id[i][j]=++cnt;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(!id[i][j])continue;
if(i<n && id[i+1][j])link(id[i][j],id[i+1][j]);
if(i>1 && id[i-1][j])link(id[i][j],id[i-1][j]);
if(j<m && id[i][j+1])link(id[i][j],id[i][j+1]);
if(j>1 && id[i][j-1])link(id[i][j],id[i][j-1]);
}
}
void work()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++){
if(s[j]=='X')a[i][j]=1;
else if(s[j]=='O')a[i][j]=2;
else x=i,y=j,a[i][j]=1;
}
}
build();
for(int i=1;i<=cnt;i++){
if(!b[i]){
memset(vis,0,sizeof(vis));
dfs(i);
}
}
int Q,ret=0;
cin>>Q;
for(int i=1;i<=Q<<1;i++){
w[id[x][y]]=1;
if(!b[id[x][y]])ans[i]=0;
else{
int u=id[x][y],v=b[u];
b[u]=b[v]=0;
memset(vis,0,sizeof(vis));
ans[i]=(!dfs(v));
}
scanf("%d%d",&x,&y);
}
for(int i=1;i<=Q;i++)
if(ans[2*i-1]&ans[i<<1])ret++;
printf("%d\n",ret);
for(int i=1;i<=Q;i++)
if(ans[2*i-1]&ans[i<<1])printf("%d\n",i);
}
int main()
{
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
work();
return 0;
}
bzoj 2437: [Noi2011]兔兔与蛋蛋的更多相关文章
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- bzoj 2437 [Noi2011]兔子和鸡蛋 [二分图匹配]
叙述性说明 这些日子.兔子和蛋像一个新的棋盘游戏. 这场比赛是在 n 行 m 在船上进行列. 前,棋盘上有一 个格子是空的,其他的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色. 每一局游戏总是兔 ...
- BZOJ.2437.[NOI2011]兔兔与蛋蛋游戏(二分图博弈 匈牙利)
题目链接 首先空格的移动等价于棋子在黑白格交替移动(设起点移向白格就是黑色),且不会走到到起点距离为奇数的黑格.到起点距离为偶数的白格(删掉就行了),且不会重复走一个格子. (然后策略就同上题了,只不 ...
- 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)
未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 693 Solved: 442 Des ...
- 2437: [Noi2011]兔兔与蛋蛋 - BZOJ
Description Input 输入的第一行包含两个正整数 n.m.接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母" ...
- 【BZOJ2437】【NOI2011】兔兔与蛋蛋(博弈论,二分图匹配)
[BZOJ2437][NOI2011]兔兔与蛋蛋(博弈论,二分图匹配) 题面 BZOJ 题解 考虑一下暴力吧. 对于每个状态,无非就是要考虑它是否是必胜状态 这个直接用\(dfs\)爆搜即可. 这样子 ...
- NOI2011 兔兔与蛋蛋游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2437 这道题真是极好的. 75分做法: 搜索. 出题人真的挺良心的,前15个数据点的范围都很小,可以 ...
- 【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论
Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...
- 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)
[BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...
随机推荐
- 总结随笔(Beta)
听说 -- beta冲刺总结 beta冲刺成员名单 姓名 学号 负责方向 个人主页 周龙荣 031402543 前端页面.跳转 http://www.cnblogs.com/ZHOULR/ 李家鹏 0 ...
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- C#网页提交html代码报错
1.在页面顶部 Page 标签加入属性 ValidateRequest="false" 2.如果开发环境是4.0及以上,在web.config加入 <system.web&g ...
- Python format 格式化函数
str.format() 格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % format 函数可以接受不限个参数,位置可以不按 ...
- JAVA_SE基础——58.如何用jar命令对java工程进行打包
有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍, ...
- Pandas速查手册中文版
本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...
- node防xss攻击插件
var xss = require('node-xss').clean; router.post("/orders/insert-orders", function (req, r ...
- 新概念英语(1-103)The French Test
Lesson 103 The French test 法语考试 Listen to the tape then answer this question. How long did the exam ...
- Spring Security入门(1-9)Spring Security 的xml 命名空间配置
- OAuth2.0学习(1-3)OAuth2.0的参与者和流程
OAuth(开放授权)是一个开放标准.允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息.而这种授权无需将用户提供用户名和密码提供给该第三方网站. OAuth允许用户提供一个令牌给第 ...