「雅礼集训 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]\ ...
随机推荐
- 2019-9-2-win10-uwp-获得焦点改变
title author date CreateTime categories win10 uwp 获得焦点改变 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 ...
- C++重载、覆盖与隐藏——转载
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...
- IntelliJ IDEA使用说明
1.IntelliJ IDEA简介: IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提 ...
- 【转载】JavaScript术语:shim 和 polyfill
在学习和使用 JavaScript 的时候,我们会经常碰到两个术语:shim 和 polyfill.它们有许多定义和解释,意思相近又有差异. Shim Shim 指的是在一个旧的环境中模拟出一个新 A ...
- $ CometOJ-Contest\#11\ D$ $Kruscal$重构树
正解:$Kruscal$重构树 解题报告: 传送门$QwQ$ 发现一个图上搞就很麻烦,考虑变为生成树达到原有效果. 因为在询问的时候是要求走到的点编号尽量小,发现这个时候点的编号就成为限制了,于是不难 ...
- Windows和Linux下与VMware虚拟机通过内网IP通讯
首先分两种情况:一种是你的电脑已经在一个内网的环境下且有额外的内网IP地址,和另一种只是想给自己电脑上的虚拟机分配个内网IP来通讯. ①有可用的内网IP 找到一个空闲的IP地址(这里以192.168. ...
- ORA-00903表名无效关于${}和#{}的使用
相当于对数据 加上 双引号,$相当于直接显示数据 ${xxx}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击 但可以使用在from之后传入表名 {}占位符? where之后 防止注入
- jdk1.7扩容时,不论是否有链表,并发都可能出现循环链表
扩容时使用transfertransfer不同于put时的判断hash冲突,直接使用头插法,如果没有冲突,则next为null.如下:e.next = newTable[i];newTable[i] ...
- 悄摸直播(二)—— 播流器实现(拉取rtmp服务器中的数据流,播放直播画面)
悄摸直播 -- JavaCV实现本机摄像头画面远程直播 播流器 一.功能说明 从rtmp服务器中获取视频流数据 + 展示直播画面 二.代码实现 /** * 播流器 * @param inputPath ...
- 1、使用 as 而不要用 is
public class ShouldAsNotIs { public void ShouldAs() { object a = new ShouldAsNotIs(); var b = a as S ...