BZOJ:1443: [JSOI2009]游戏Game
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443
反正不看题解我是完全想不出系列……
先把棋盘黑白染色,也就是同一对角线上颜色相同,使得一个格子上下左右都不同色。
然后我们会发现,某一个人所走的全部格子颜色都是相同的。
把黑白格子当作点提取出来,放在两边,就变成了二分图,游戏的全过程变得像匈牙利算法的增广。
这提示我们也许跟二分图匹配有关。
如果一个点必定在最大匹配中,而一开始棋子放在了这里小YY只要沿着匹配边走小AA就gg了。
注意这里说的是必定在最大匹配中,所以并不用担心出现走到某个非匹配点后小YY无路可走的情形,此时可以通过伪增广保持最大匹配数不变而使起点不在匹配点中。
对于匈牙利算法,可以通过类似的伪增广找出所有不一定在最大匹配中的点。
对于网络流,未被割掉与源汇相邻的边的点肯定是答案,至于其他可以是答案的点,可以通过走反向边(与匈牙利类似的交错路径)来实现到达汇点或从源点出发可达。也就是在残余网络中源点可达且在二分图靠近源点一侧的点,可到达汇点且在二分图靠近汇点一侧的点(没这俩限制就gg了)都是答案点。(注意建图时建单向边,即反向边初始流量为0)
#include<cstdio>
#include<algorithm>
#define MN 110001
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
const int fx[]={,-,,},fy[]={,,,-};
struct na{int y,f,ne;}b[MN];
int n,m,l[MN],be[][],nm=,S,T,num=,d[MN],g[MN],c[MN],mmh=;
bool bo[MN],O_O[MN];
char s[][];
inline void add(int x,int y,int f){b[++num].y=y;b[num].f=f;b[num].ne=l[x];l[x]=num;}
inline void in(int x,int y,int f){add(x,y,f);add(y,x,);}
int sap(int x,int f){
if (x==T) return f;
int h=,q;
for (int i=d[x];i;i=b[i].ne)
if (b[i].f&&g[x]==g[b[i].y]+){
q=sap(b[i].y,min(f-h,b[i].f));
b[i].f-=q;b[i^].f+=q;h+=q;d[x]=l[x];
if (h==f) return h;
if (g[S]==nm) return h;
}
if (!--c[g[x]]) g[S]=nm;++c[++g[x]];d[x]=l[x];
return h;
}
void dfs(int x,bool B){
if (bo[x]) return;
bo[x]=;O_O[x]^=B;
for (int i=l[x];i;i=b[i].ne)
if (b[i].f==B) dfs(b[i].y,B);
}
int main(){
register int i,j,k;
n=read();m=read();
for (i=;i<=n;i++) scanf("%s",s[i]+); for (i=;i<=n;i++)
for (j=;j<=m;j++) if (s[i][j]=='.') be[i][j]=++nm;
S=++nm;T=++nm; for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (s[i][j]=='.')
for (k=;k<;k++)
if (s[i+fx[k]][j+fy[k]]=='.')
if ((i+j)&) in(be[i+fx[k]][j+fy[k]],be[i][j],);else in(be[i][j],be[i+fx[k]][j+fy[k]],); for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (s[i][j]=='.') if (mmh++,O_O[be[i][j]]=((i+j)&)) in(be[i][j],T,);else in(S,be[i][j],); for (;g[S]<nm;mmh-=*sap(S,1e9));
if (!mmh) return puts("LOSE"),;
puts("WIN");
dfs(S,);dfs(T,);
for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (s[i][j]=='.'&&bo[be[i][j]]&&O_O[be[i][j]]) printf("%d %d\n",i,j);
}
BZOJ:1443: [JSOI2009]游戏Game的更多相关文章
- BZOJ.1443.[JSOI2009]游戏Game(二分图博弈 匈牙利)
题目链接 \(Description\) 一个\(N*M\)的有障碍的棋盘,先手放置棋子后,从后手开始轮流移动棋子,不能走重复的位置,不能移动的输.求在哪些位置放棋子是先手必胜的. \(Solutio ...
- BZOJ 1443 [JSOI2009]游戏Game ——博弈论
好题. 首先看到棋盘,先黑白染色. 然后就是二分图的经典模型. 考虑最特殊的情况,完美匹配,那么先手必胜, 因为无论如何,先手走匹配边,后手无论走哪条边,总有对应的匹配边. 如果在不在最大匹配中出发, ...
- 【BZOJ】1443: [JSOI2009]游戏Game
[算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...
- BZOJ:[JSOI2009]游戏Game【二分图匹配乱搞】
题目大意:n*m的棋盘,其中有些区域是禁区,两个人在棋盘上进行博弈,后手选择棋子的初始位置,然后先后手轮流将棋子往上下左右移动,走过的区域不能再走,问能否有一个位置使得后手必胜 Input 输入数据首 ...
- BZOJ1443: [JSOI2009]游戏Game
如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配 现在有了一些不能走的格子 黑白染色后求出最大匹配 如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输 否则的 ...
- JSOI2009 游戏
1443: [JSOI2009]游戏Game Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 557 Solved: 251[Submit][Stat ...
- BZOJ 1444:[JSOI2009]有趣的游戏
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...
- [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)
[BZOJ 2257][JSOI2009]瓶子和燃料 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子 ...
- 洛谷 P4571 BZOJ 2257 [JSOI2009]瓶子和燃料
bzoj题目链接 上面hint那里是选择第2个瓶子和第3个瓶子 Time limit 10000 ms Memory limit 131072 kB OS Linux Source Jsoi2009 ...
随机推荐
- C# 委托详解(一)
1.委托简单例子 class eeProgram { // 声明delegate对象 public delegate string CompareDelegate(int a, int b); // ...
- 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)
最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...
- JavaWeb之Java Servlet完全教程(转)
Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...
- 将自己的域名代理到Gitpages
相信有很多程序员都有自己的域名,甚至很多人还有自己的服务器.去年我也买了半年的阿里云,在tomcat里面发war包,相当于一个正式的项目.但是很多前端程序员应该要求很简单,就是能将静态的html发布就 ...
- bzoj 3528: [Zjoi2014]星系调查
Description 银河历59451年,在银河系有许许多多已被人类殖民的星系.如果想要在行 星系间往来,大家一般使用连接两个行星系的跳跃星门. 一个跳跃星门可以把 物质在它所连接的两个行星系中互 ...
- bzoj 1996: [Hnoi2010]chorus 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...
- ubuntu下加载mcypt
mcrypt 是php 里面重要的加密支持扩展库,linux环境下:该库在默认情况下不开启.window环境下:PHP>=5.3,默认开启mcrypt扩展 1.命令行下载(不嫌麻烦可以到网上找安 ...
- Nginx 错误处理方法: bind() to 0.0.0.0:80 failed
Nginx 错误处理方法: bind() to 0.0.0.0:80 failed 今天启动window上的nginx总是报错 错误信息是bind() to 0.0.0.0:80 failed (10 ...
- 使用JavaScript将图片保存至本地
在最近的开发当中,我们需要为img标签以及canvas动态绘制的图像提供下载功能,下面是经过探索后我们得出的结果. 一.Canvas 版本 // 下载Canvas元素的图片 function down ...
- JavaUtil_06_DES加解密工具
一.示例 CommonUtil.java package com.ray.test.des; import java.io.ByteArrayOutputStream; import java.io. ...