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 ...
随机推荐
- 网站对话框开源脚本--ArtDialog V6.0
初识对话框脚本觉得artDialog还是挺不错的开源的js脚本,最新版本都是V6.0 ,相对之前版本,artDialog的语法也发生很大的变化,windows对应的JS版本如下 点击下载 语法也发生变 ...
- .NET Nancy 详解(四) Self Host
Self Host 使得Nancy 能够在任意application 中启动,无论是console 还是windows service.这期我们使用的版本是Nancy v0.4.0. Demo 首先看 ...
- WebRTC音视频引擎研究(1)--整体架构分析
WebRTC技术交流群:234795279 原文地址:http://blog.csdn.net/temotemo/article/details/7530504 1.WebRTC目的 ...
- 直接拿来用!最火的Android开源项目(二)(转)
GitHub上的开源项目不胜枚举,通过这些项目,也能让开发者在应用开发过程中事半功倍,作为开发者的你,在用这些开源项目吗?今天我们将介绍另外20个在GitHub上备受欢迎的Android开源项目,你准 ...
- ML 07、机器学习中的距离度量
机器学习算法 原理.实现与实践 —— 距离的度量 声明:本篇文章内容大部分转载于July于CSDN的文章:从K近邻算法.距离度量谈到KD树.SIFT+BBF算法,对内容格式与公式进行了重新整理.同时, ...
- 2015腾讯web前端笔试题
1 请实现,鼠标点击页面中的任意标签,alert该标签的名称.(注意兼容性) 2 请指出一下代码的性能问题,并经行优化. var info="腾讯拍拍网(www.paipai.com)是 ...
- SQLServer 维护脚本分享(05)内存(Memory)
--查看设置的最大最小每次 exec sp_configure 'max server memory (MB)' exec sp_configure 'min server memory (MB)' ...
- 【SQL 数据库】将一张数据表信息复制到另一张数据表
一.MySQL数据库 1.如果目标表存在 INSERT INTO 目标表 SELECT * FROM 源表; 2.如果目标表不存在 CREATE TABLE 目标表 SELECT * FROM ...
- 关于本地存储构成数组以及jquery的inArray方法的使用
for (var i=0, j = _self.sessionStorage.length; i < j; i++){ var key = _self.sessionStorage.key(i) ...
- linux命令缩写及全称
apt = Advanced Packaging Tool ar = archiver as = assembler awk = "Aho Weiberger and Kernighan&q ...