什么神仙思路啊……

看到棋盘就去想二分图。(smg啊)(其实是校内模拟赛有基本一样的题,只不过直接给了个二分图)

看到二分图就去想最大匹配。(我怎么想偶环的性质去了)

(以下内容摘自这里

这个二分图的某种最大匹配方案中,从非匹配点出发先手必败:先手只能走到匹配点(否则不是最大匹配),后手只需要一直走匹配边即可,先手操作时不可能走到非匹配点(否则存在增广路,与最大匹配矛盾),所以先手必败。

容易发现,当且仅当出发点一定在最大匹配中,先手才会胜利。

(注:这里我觉得有点问题,虽然我大概能感受到究竟为什么是对的,但我说不出,所以咕了)

所以,一个起点使先手必胜当且仅当它一定在最大匹配中。

判断的话,先求出任意一个最大匹配。然后对有匹配的点,如果与他有匹配的点能找到另一个匹配,那么它实际上不合法,否则合法。

用匈牙利算法即可做到 \(O((nm)^2)\)。实际上常数小,跑不满,跑得飞快。

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010,mod=998244353,d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,el,cnt,head[maxn],to[maxn],nxt[maxn],dis[maxn],with[maxn],x[maxn],y[maxn],id[111][111],tot;
char mp[111][111];
bool vis[maxn],ans[maxn];
inline void add(int u,int v){
to[++el]=v;nxt[el]=head[u];head[u]=el;
}
void dfs(int u){
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(~dis[v]) continue;
dis[v]=dis[u]^1;
dfs(v);
}
}
bool dfs2(int u){
if(vis[u]) return false;
vis[u]=true;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(!with[v] || dfs2(with[v])){
with[with[u]]=0;
with[u]=v;with[v]=u;
return true;
}
}
return false;
}
int main(){
n=read();m=read();
FOR(i,1,n) scanf("%s",mp[i]+1);
FOR(i,1,n) FOR(j,1,m) if(mp[i][j]=='.') id[i][j]=++cnt,x[cnt]=i,y[cnt]=j;
FOR(i,1,n) FOR(j,1,m) if(mp[i][j]=='.'){
FOR(k,0,3){
int ti=i+d[k][0],tj=j+d[k][1];
if(ti<1 || ti>n || tj<1 || tj>m || mp[ti][tj]=='#') continue;
add(id[i][j],id[ti][tj]);
}
}
MEM(dis,-1);
FOR(i,1,cnt) if(dis[i]==-1) dis[i]=0,dfs(i);
FOR(i,1,cnt) if(dis[i]){
MEM(vis,0);
dfs2(i);
}
FOR(i,1,cnt) if(with[i]){
MEM(vis,0);
ans[i]=!dfs2(with[i]);
}
FOR(i,1,cnt) if(!ans[i]) tot++;
printf("%d\n",tot);
FOR(i,1,cnt) if(!ans[i]) printf("%d %d\n",x[i],y[i]);
}

LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)的更多相关文章

  1. loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)

    题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...

  2. [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]

    题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...

  3. 「雅礼集训 2017 Day2」棋盘游戏

    祝各位圣诞后快乐(逃) 题目传送门 分析: 首先棋盘上的路径构成的图是一张二分图 那么对于一个二分图,先求出最大匹配,先手如果走到关键匹配点,只要后手顺着匹配边走,由于不再会出现增广路径,所以走到最后 ...

  4. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  5. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  6. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  7. loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)

    题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...

  8. LOJ#6032. 「雅礼集训 2017 Day2」水箱

    传送门 首先可以有一个平方复杂度的 \(DP\) 设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案 令 \(h_i\) 表示隔板 \(i\) 的高度 当 \(j ...

  9. 「雅礼集训 2017 Day2」水箱

    题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...

随机推荐

  1. 推荐一款好看的Hexo主题Ayer

    介绍 Ayer 是一个干净且优雅的Hexo主题,自带响应式,加载速度很快,该有的功能都有,可配置项也很多,非常适合作为你的博客主题,主题内还附送了6张精美的高清壁纸.欢迎使用和Star支持,如果你在使 ...

  2. JS---DOM---点击操作---part2---14个案例

    案例1:点击按钮禁用文本框 <input type="button" value="禁用文本框" id="btn" /> < ...

  3. 理解ES6的新数据类型:Symbol

    ES6之前的数组类型 在ES6之前JS只有6种数据类型,分别是:Undefined.Null.布尔值(Boolean).字符串(String).数值(Number).对象(Object). ES6引入 ...

  4. VMware安装vmtools实现宿主机和虚拟机共享粘贴板

    打开VMware以Ubuntu14.04.6为例,保持网络畅通,在线下载工具包 下载完成后dvd下出现该压缩包 将其复制到桌面并在桌面进入终端 执行命令: tar -zxvf xxxx.tar.gz ...

  5. 在 Cocos2d-x 中添加自己的微博链接

    配置:OS X 10.10 + Xcode 6.0 + Cocos2d-x-3.2 一.Android 端代码 1.在 Cocos2dxActivity.java 中添加openUrl函数并导入响应包 ...

  6. 「Shimo使用指南」mac支持pptp协议的小软件

    Mac的好多小伙伴在访问网络设备时觉得远程连接不方便,例如ssh,***登陆都不是很方便,后来又安装了open*** forMac.ISSH等客户端,使用后发现不是很稳定,断线后很久都无法连接等缺点, ...

  7. centos7 链路聚合+KVM桥接连网

    一.两个物理网卡做链路聚合(em3,em4) 1)创建team类型的网卡,连接别名为team0,使用的模式为activebackup-主备/loadbalance-负载均衡nmcli con add ...

  8. 【Springboot】spring-boot-starter-redis包报错 :unknown

    springboot集成redis时,引入spring-boot-starter-redis包报错,maven找不到这个资源.如下图: 我的项目中,spring boot是 用的2.0.4版本.spr ...

  9. 多进程操作-进程队列multiprocess.Queue的使用

    一.ipc机制 进程通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁 queue 下面拿代码来实现Queue如何使用: 案例一: from multiprocessing import Q ...

  10. NetCore的Docker部署

    NetCore的Docker部署 一.NetCore与Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或 ...