BZOJ1443: [JSOI2009]游戏Game
如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配
现在有了一些不能走的格子
黑白染色后求出最大匹配
如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输
否则的话,将棋子放在不是必须点的点上则先手必赢
证明是这样的:
先手先选一个不在最大匹配里面的点,然后对手有两种情况:
一、走一个在最大匹配里的点,然后有了上面考虑错的那种情况,但是不同的是,如果出现了后手最后走某边达到一个非最大匹配中点,就代表出现了一条增广路,显然因为是最大匹配,所以这种情况是不会出现的,所以这种情况先手必胜。
二、走一个不在最大匹配里的点,然后?诶?这是显然的不对啊!直接增广了,连反向弧神马都不用!!!
于是~~~先手必胜。
于是问题转化为了如何求二分图匹配中的非必须点
求这个的话,直接从一个非匹配点dfs到同一边的匹配点就可以了,注意是可以从一个同侧匹配点到另一个同侧匹配点的
一开始算的时候,我在dfs到一个匹配点就直接return了,思路不清晰的锅
应该是记忆化搜索。。。
为什么关于图的题总是要写很久很久呢 不开森
#include<bits/stdc++.h>
using namespace std;
int n,mm;
#define N 250005
struct Node{
int to,next;
}e[N*];
char s[][];
int tot,head[N],idx[N],idy[N],id[][],match[N],m[N],n1,n2,t1,t2,ans;
int h[]={-,,,};
int l[]={,-,,};
bool vis[N],v[N],flag;
void add(int x,int y){
e[++tot]=(Node){y,head[x]};head[x]=tot;
e[++tot]=(Node){x,head[y]};head[y]=tot;
}
bool dfs(int x){
for(int i=head[x];i;i=e[i].next)
if(!vis[e[i].to]){
vis[e[i].to]=;
if(!match[e[i].to]||dfs(match[e[i].to])){
match[e[i].to]=x;m[x]=e[i].to;return ;
}
}
return ;
}
void dfsz(int x){
v[x]=;
for(int i=head[x];i;i=e[i].next){
if(!v[match[e[i].to]])dfsz(match[e[i].to]);
}
}
void dfsy(int x){
v[x]=;
for(int i=head[x];i;i=e[i].next){
if(!v[m[e[i].to]])dfsy(m[e[i].to]);
}
}
int main(){
scanf("%d%d",&n,&mm);
for(int i=;i<=n;i++){
scanf("%s",s[i]+);
for(int j=;j<=mm;j++)if(s[i][j]!='#')
if((i+j)%==)n2++;else n1++;
}
t1=;t2=n1;
for(int i=;i<=n;i++)
for(int j=;j<=mm;j++)if(s[i][j]!='#'&&(i+j)%){
if(!id[i][j])id[i][j]=++t1,idx[t1]=i,idy[t1]=j;
for(int k=;k<;k++){
int x=i+h[k],y=j+l[k];
if(x&&y&&x<=n&&y<=mm&&s[x][y]!='#'){
if(!id[x][y])id[x][y]=++t2,idx[t2]=x,idy[t2]=y;
add(id[i][j],id[x][y]);
}
}
} for(int i=;i<=n1;i++){
memset(vis,,sizeof(vis));
if(dfs(i))ans++;
}
if(ans==n1&&ans==n2){puts("LOSE");return ;} for(int i=;i<=n1;i++)if(!m[i])dfsz(i);
for(int i=n1+;i<=n1+n2;i++)if(!match[i])dfsy(i);
// for(int i=1;i<=t2;i++)cout<<i<<' '<<v[i]<<endl;
puts("WIN");
for(int i=;i<=n;i++)
for(int j=;j<=mm;j++)
if(v[id[i][j]])printf("%d %d\n",i,j);
return ;
}
1443: [JSOI2009]游戏Game
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 964 Solved: 431
[Submit][Status][Discuss]
Description

Input
输入数据首先输入两个整数N,M,表示了迷宫的边长。 接下来N行,每行M个字符,描述了迷宫。
Output
若小AA能够赢得游戏,则输出一行"WIN",然后输出所有可以赢得游戏的起始位置,按行优先顺序输出 每行一个,否则输出一行"LOSE"(不包含引号)。
Sample Input
.##
...
#.#
Sample Output
2 3
3 2
HINT
对于100%的数据,有1≤n,m≤100。 对于30%的数据,有1≤n,m≤5。
BZOJ1443: [JSOI2009]游戏Game的更多相关文章
- BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】
题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...
- JSOI2009 游戏
1443: [JSOI2009]游戏Game Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 557 Solved: 251[Submit][Stat ...
- 【BZOJ1443】游戏(二分图匹配,博弈论)
[BZOJ1443]游戏(二分图匹配,博弈论) 题面 BZOJ 题解 很明显的二分图博弈问题. 发现每次移动一定是从一个黑点到达一个白点,或者反过来. 所以可以对于棋盘进行染色然后连边. 考虑一下必胜 ...
- 【BZOJ1443】[JSOI2009]游戏Game(二分图+博弈)
BZOJ 题意: 给出一个\(n*m\)的网格,其中有一些障碍点. 现在两个人玩游戏,首先先手选定一个点,然后从后手开始轮流移动,不能移动者即输掉这次游戏. 规定不能移动到那些之前已经到过的格子上. ...
- BZOJ:1443: [JSOI2009]游戏Game
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...
- [JSOI2009]游戏Game
Description Input 输入数据首先输入两个整数N,M,表示了迷宫的边长. 接下来N行,每行M个字符,描述了迷宫. Output 若小AA能够赢得游戏,则输出一行"WIN&quo ...
- BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】
题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...
- 【BZOJ】1443: [JSOI2009]游戏Game
[算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...
- BZOJ.1443.[JSOI2009]游戏Game(二分图博弈 匈牙利)
题目链接 \(Description\) 一个\(N*M\)的有障碍的棋盘,先手放置棋子后,从后手开始轮流移动棋子,不能走重复的位置,不能移动的输.求在哪些位置放棋子是先手必胜的. \(Solutio ...
随机推荐
- ytu 1067: 顺序排号(约瑟夫环)
1067: 顺序排号 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 31 Solved: 16[Submit][Status][Web Board] ...
- ORA-03113:通信通道的文件结尾解决
今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去查看怎么回事,然后问题进一步出现,错误“OR ...
- (五)WebRTC手记Channel概念
转自:http://www.cnblogs.com/fangkm/p/4401075.html 前面两篇博文完整地介绍了WebRTC音视频的采集模块,接下来应该开始介绍关键的音视频编码模块.不过在介绍 ...
- UML- 模型图介绍
第一类 用例图 第二类 静态图 类图 对象图 包图第三类 行为图 状态图 活动图第四类 交互图 序列图 协助图第五类 实现图 构件图 部署图 1 用例图:从用户角度描述系统功能,以及每个系统功 ...
- error C2039: “bind2nd”: 不是“std”的成员
VS2012 出现如下错误: error C2039: "bind2nd": 不是"std"的成员 头文件中加上 #include <functi ...
- 智能车学习(二十二)——浅谈速度控制
一.经典PID控制 使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期.. 二.PID加棒棒控制 针对 ...
- apk签名(不打包)
apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...
- AJAX案例三:处理XML响应
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- RobotFramework自动化测试之环境搭建安装教程(一)
RobotFramework是基于Python语言的工具,所以装RF之前要先安装Python: Python现在有2.7跟3.5两个版本,如果是先装了3.5的话,是装不了2.7的.只有先装2.7的 才 ...
- 性能测试-ORACLE性能监控
通过lr做性能测试的过程,通过监控Oracle数据库的性能 采用的监控工具:PeOny PeOny安装 1. 安装服务端 1) LINUX平台安装 解压缩peony3.x.0.x.tar.gz文件,b ...