「雅礼集训 2017 Day2」棋盘游戏
祝各位圣诞后快乐(逃)
题目传送门
分析:
首先棋盘上的路径构成的图是一张二分图
那么对于一个二分图,先求出最大匹配,先手如果走到关键匹配点,只要后手顺着匹配边走,由于不再会出现增广路径,所以走到最后先手就必败
所以Alice只要到非关键匹配点,Bob便一定会走到关键匹配点,然后Alice便必胜
于是求一下那些点是非关键匹配点就好了
真难想233
我好菜233
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue> #define maxn 500005
#define maxm 105
#define INF 0x3f3f3f3f using namespace std; inline long long getint()
{
long long num=,flag=;char c;
while((c=getchar())<''||c>'')if(c=='-')flag=-;
while(c>=''&&c<='')num=num*+c-,c=getchar();
return num*flag;
} int n,m;
int S,T;
int fir[maxn],nxt[maxn],to[maxn],cap[maxn],cnt;
int h[maxn],vis[maxn];
char s[maxm][maxm];
int ans[maxm][maxm]; inline void newnode(int u,int v,int w)
{to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,cap[cnt]=w;}
inline void insert(int u,int v,int w)
{newnode(u,v,w),newnode(v,u,);} inline bool bfs()
{
memset(h,-,sizeof h);h[S]=;
queue<int>Q;Q.push(S);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=fir[u];i;i=nxt[i])
if(!~h[to[i]]&&cap[i])h[to[i]]=h[u]+,Q.push(to[i]);
}
return ~h[T];
} inline int aug(int u,int flow)
{
if(u==T||!flow)return flow;
int used=;
for(int i=fir[u];i;i=nxt[i])
if(cap[i]&&h[to[i]]==h[u]+)
{
int delta=aug(to[i],min(flow-used,cap[i]));
cap[i]-=delta,cap[i^]+=delta,used+=delta;
if(used==flow)return flow;
}
if(!used)h[u]=-;
return used;
} inline int dinic()
{
int num=;
while(bfs())num+=aug(S,INF);
return num;
} inline void dfs(int u)
{
vis[u]=;
for(int i=fir[u];i;i=nxt[i])if(!vis[to[i]]&&cap[i])dfs(to[i]);
} inline void dfs2(int u)
{
vis[u]=;
for(int i=fir[u];i;i=nxt[i])if(!vis[to[i]]&&cap[i^])dfs2(to[i]);
} inline int getid(int i,int j){return i*m+j-m;} int main()
{
n=getint(),m=getint();int num=;
for(int i=;i<=n;i++)scanf("%s",s[i]+);
S=n*m+,T=S+;cnt=;
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
{
if(((i+j)&)&&s[i][j]=='.')
{
insert(S,getid(i,j),);
if(s[i-][j]=='.')insert(getid(i,j),getid(i-,j),INF);
if(s[i+][j]=='.')insert(getid(i,j),getid(i+,j),INF);
if(s[i][j-]=='.')insert(getid(i,j),getid(i,j-),INF);
if(s[i][j+]=='.')insert(getid(i,j),getid(i,j+),INF);
}
if(!((i+j)&)&&s[i][j]=='.')insert(getid(i,j),T,);
}
dinic();
dfs(S);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
if(((i+j)&)&&s[i][j]=='.'&&vis[getid(i,j)])ans[i][j]=,num++;
memset(vis,,sizeof vis);
dfs2(T);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
if(!((i+j)&)&&s[i][j]=='.'&&vis[getid(i,j)])ans[i][j]=,num++;
printf("%d\n",num);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
if(ans[i][j])printf("%d %d\n",i,j);
}
「雅礼集训 2017 Day2」棋盘游戏的更多相关文章
- loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
什么神仙思路啊-- 看到棋盘就去想二分图.(smg啊)(其实是校内模拟赛有基本一样的题,只不过直接给了个二分图) 看到二分图就去想最大匹配.(我怎么想偶环的性质去了) (以下内容摘自这里) 这个二分图 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...
- 【loj6034】「雅礼集训 2017 Day2」线段游戏
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- LOJ#6032. 「雅礼集训 2017 Day2」水箱
传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...
- 「雅礼集训 2017 Day2」水箱
题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...
随机推荐
- vue-learning:11 -js-nextTick()
nextTick() 在jQuery中,如果我们要生成一个ul-li的列表元素,我们也不会在循环体中每生成一个li就将它插入到ul中,而是在循环体内拼接每个li,待循环体结束后,再一并添加到ul元素上 ...
- C++ windows客户端支持SSL双向认证
C++ windows客户端支持SSL双向认证,服务端是JAVA开发的,使用的证书是jks格式的.C++并不支持JKS格式的证书,所以要用openssl进行转换下. 1. 需要先把jks转成.p12文 ...
- 2018-10-23-WPF-使用-Pandoc-把-Markdown-转-Docx
title author date CreateTime categories WPF 使用 Pandoc 把 Markdown 转 Docx lindexi 2018-10-23 11:35:47 ...
- Lede定时重拨
系统,计划任务, 0 4 * * * ifup wan 梅林定时重拨: #! /bin/sh #断开拨号连接 killall pppd #延时10秒 #重新拨号 pppd >& &a ...
- Struts2注解详解(转)
一,引入支持Struts2支持注解开发jar包: struts2-convention-plugin-2.1.8.1.jar(支持Struts2框架注解开发的jar包) 二,Struts2使用注解开发 ...
- Jmeter阶梯加压监听
巧用beanshell,做阶梯加压监听 1. 首先先添加阶梯加压线程组 bzm - Concurrency Thread Group 设置阶梯加压值,目标最大并发用户为80,加速步率时长为100秒, ...
- Android Drawable - Shape Drawable使用详解(附图)
TIPS shape图形 –简单介绍 shape图形 –如何画? shape图形 –参数详细解析 shape图形 –如何用? shape图形 –实际开发应用场景 shape图形简单介绍 用xml实现一 ...
- 004使用u-boot烧写裸版程序
- 【题解】HDU Homework(倍增)
[题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...
- DataX-MysqlWriter 插件文档
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...