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 ...
随机推荐
- Delphi中函数定义和声明的位置
当函数(或过程)A定义在函数(或过程)B之前,那么函数B就可以调用函数A,并且编译成功,例如下面的 procedure TForm1.btn1Click(Sender: TObject); 和 f ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- hdu 1754:I Hate It(线段树,入门题,RMQ问题)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- git 创建本地分支,然后推送到服务器上
git checkout -b crm-2.repair-callback.phoneSet git checkout -b crm-2.repair-callback.RepairHis git p ...
- Debian下安装vim
问题描述:安装完系统以后,刚要打算开始写程序,发现,vim还没有装,用su -切换到root后 直接运行apt-get install vim,提示插入disc源,然后回车,陷入无法解决的状态. 上网 ...
- 在ubuntu中安装jdk
安装环境 操作系统:ubuntu 14.04.1 server amd64 下载jdk wget http://download.oracle.com/otn-pub/java/jdk/7u67-b0 ...
- 在Salesforce中处理Xml的生成与解析
在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...
- 三层+MVC导出Excel(2)
背景: 出门在外,一切以健康为主,学习为辅,健康搞好了,学习也不能拉下,在外工作期间,我们在做数据导出的时候,自己封了一个类,利用NPOI进行数据导出Excel,自我感觉良好,特给大家分享一下,希望对 ...
- 导出word使用模版
在我们做我们的小组项目的时候,刚开始的时候我们用到的是Mvc+EF,用上了我们的ITOO框架.在最开始的计划,我们要用到瑞郎报表.可是呢,由于工期原因以及技术暂时没有实现,我们不得不想一个比较折中的方 ...
- PB之入门-itemchanged(long row,dwobject dwo,string data)
每天的总结都是必须,好记性不如烂笔头,好吧,一星期没做笔记了,最近忙上PB了,哎东学学西学学,最可怕的就是最后都半斤八两,吐槽一下关于PB的资源为何如此之少,今天记录的是关于itemchanged事件 ...