如果没有不能走的格子的话,和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

3 3
.##
...
#.#

Sample Output

WIN
2 3
3 2

HINT

对于100%的数据,有1≤n,m≤100。 对于30%的数据,有1≤n,m≤5。

BZOJ1443: [JSOI2009]游戏Game的更多相关文章

  1. BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】

    题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...

  2. JSOI2009 游戏

    1443: [JSOI2009]游戏Game Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 251[Submit][Stat ...

  3. 【BZOJ1443】游戏(二分图匹配,博弈论)

    [BZOJ1443]游戏(二分图匹配,博弈论) 题面 BZOJ 题解 很明显的二分图博弈问题. 发现每次移动一定是从一个黑点到达一个白点,或者反过来. 所以可以对于棋盘进行染色然后连边. 考虑一下必胜 ...

  4. 【BZOJ1443】[JSOI2009]游戏Game(二分图+博弈)

    BZOJ 题意: 给出一个\(n*m\)的网格,其中有一些障碍点. 现在两个人玩游戏,首先先手选定一个点,然后从后手开始轮流移动,不能移动者即输掉这次游戏. 规定不能移动到那些之前已经到过的格子上. ...

  5. BZOJ:1443: [JSOI2009]游戏Game

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...

  6. [JSOI2009]游戏Game

    Description Input 输入数据首先输入两个整数N,M,表示了迷宫的边长. 接下来N行,每行M个字符,描述了迷宫. Output 若小AA能够赢得游戏,则输出一行"WIN&quo ...

  7. BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】

    题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...

  8. 【BZOJ】1443: [JSOI2009]游戏Game

    [算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...

  9. BZOJ.1443.[JSOI2009]游戏Game(二分图博弈 匈牙利)

    题目链接 \(Description\) 一个\(N*M\)的有障碍的棋盘,先手放置棋子后,从后手开始轮流移动棋子,不能走重复的位置,不能移动的输.求在哪些位置放棋子是先手必胜的. \(Solutio ...

随机推荐

  1. Web API 使用上安全吗?

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  2. jquery获取radio和select选中值

    //jquery 获取radio选中值 <input type="radio" name="c_type" value="a" > ...

  3. ASSM 的三级位图结构

    自动段空间管理(ASSM),它首次出现在Oracle920里(在920以前,段空间的管理方式叫做MSSM,它是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的 ...

  4. 注解:【有连接表的】Hibernate单向1->N关联

    Person与Address关联:单向1->N,[有连接表的] Person.java package org.crazyit.app.domain; import java.util.Hash ...

  5. 通过ajax访问Tomcat服务器web service接口时出现No 'Access-Control-Allow-Origin' header问题的解决办法

    问题描述 通过ajax访问Web服务器(Tomcat7.0.42)中的json web service接口的时候,报以下跨域问题: XMLHttpRequest cannot load http:// ...

  6. SQL简繁转换函数

    declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...

  7. Python入门之树莓派

    Linux命令行$+命令 pwd显示当前目录 ls列表 cd改变当前目录,/ sudo超级用户输入,特权来操作系统相关设置或删除文件 sudo apt-get  install  安装程序 sudo ...

  8. 《DSP using MATLAB》示例Example4.11

    代码: b = [1, 0]; a = [1, -0.9]; % %% ---------------------------------------------- %% START a determ ...

  9. HTTP基础09--web(1)

    Web 应用 通过 Web 提供功能的 Web 应用 原本应用 HTTP 协议的 Web 的机制就是对客户端发来的请求,返回事前准备好的内容.可随着 Web 越来越普及,仅靠这样的做法已不足以应对所有 ...

  10. 解决Kali Linux没有声音

    解决Kali Linux没有声音   Kali Linux系统默认状态下,root用户是无法使用声卡的,也就没有声音.启用的方法如下: (1)在终端执行命令:systemctl --user enab ...