如果没有不能走的格子的话,和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. 在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程

    在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程 本教程提供PDF格式下载: 在RedHat.Enterprise.Linux_v6.3系统中安装Ora ...

  2. 几年前做家教写的C教程(之二)

    C语言学习宝典(2) 认识C语言中的运算符: (1)算术运算符   (+  -  *  /  %) (2)关系运算符    (>  <  ==  >=  <=  != ) (3 ...

  3. 小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】

    小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中 ...

  4. Oracle 数组赋值

    只需要像下面这样就OK了 begin -- Call the procedure in_var(1):=null;in_var(1):='a123123'; pack_abc.pro_abc(in_v ...

  5. POJ2406 Power Strings(KMP,后缀数组)

    这题可以用后缀数组,KMP方法做 后缀数组做法开始想不出来,看的题解,方法是枚举串长len的约数k,看lcp(suffix(0), suffix(k))的长度是否为n- k ,若为真则len / k即 ...

  6. OS X thrift setup

    OS X Setup The following command install all the required tools and libraries to build and install t ...

  7. Web开发基本准则-55实录-Web访问安全

    Web开发工程师请阅读下面的前端开发准则,这是第一部分,强调了过去几年里我们注意到的Web工程师务须处理的Web访问安全基础点.尤其是一些从传统软件开发转入互联网开发的工程师,请仔细阅读,不要因为忽视 ...

  8. 遍历List过程中删除元素的正确做法(转)

    遍历List过程中删除元素的正确做法   public class ListRemoveTest {     3 public static void main(String[] args) { 4 ...

  9. Android adb的使用

    参考:http://blog.csdn.net/veryitman/article/details/6437090 1. 进入shell 进入设备shell adb shell 2. 安装 apk & ...

  10. codeforce ABBYY Cup 3.0 - Finals (online version) B2. Shave Beaver! 线段树

    B2. Shave Beaver!   The Smart Beaver has recently designed and built an innovative nanotechnologic a ...