什么神仙思路啊……

看到棋盘就去想二分图。(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. JS 算数

    JS 算数 Math(算数)对象的作用是:执行常见的算数任务. random() 来返回 0 到 1 之间的随机数. max() 来返回两个给定的数中的较大的数.(在 ECMASCript v3 之前 ...

  2. 【Beta阶段】第十周Scrum会议

    [Beta阶段]第十周Scrum会议 本次会议为第十周第一次Scrum Meeting,会议对Alpha阶段的工作进行了反思总结,以及对Beta阶段工作的展望. 会议时间为2019.11.23.会议地 ...

  3. OAuthon2.0机制详解

    最近在忙企业微信和钉钉的第三方应用开发,需要获取一些信息,第一个就是这个OAuthon2.0,先详细了解下概念和流程 一.应用场景 我们要想用第三方播放器播放你的云盘账号里面的一些秘密视频资源,为了要 ...

  4. SSM案例整合踩的一些坑

    一.出现错误:Cannot convert value of type [java.lang.String] to required type [javax.sql.DataSource] for p ...

  5. WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言

    大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...

  6. JavaScript-----13.内置对象 Math()和Date()

    1. 内置对象 js对象分为3种:自定义对象(var obj={}).内置对象.浏览器对象. 前两种对象是js基础内容,属于ECMAScript,第三个浏览器对象是js独有的.讲js API的时候会讲 ...

  7. 【西北师大-2108Java】第十次作业成绩汇总

    [西北师大-2108Java]第十次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第12周学习指导及要求 实验目的与要求 (1)掌握Vetor.Stack.Hashtable三个类的用途及常用 ...

  8. 呵呵,asp.net 屁东西我都会忘记

    ASP.NET中的好些基本的东西有的忘了,有的需要学,从现在开始,给自己开一个基本的常用知识点的总结,一是学习,二是备忘. 今天算是第一篇吧! DropDownList在从数据库中得到数据源绑定后,计 ...

  9. event demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...