题目链接

BZOJ2437

题解

JSOI2014很像

只不过这题动态删点

如果我们把空位置看做\(X\)的话,就会发现我们走的路径是一个\(OX\)交错的路径

然后将图二分染色,当前点必胜,当且仅当当前点必须作为最大匹配的匹配点

移动相当于删点,删点的话只需打个标记即可

判断当前点是不是必选,只需尝试更改当前点匹配点的匹配点即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 1605,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int h[maxn],ne = 1;
struct EDGE{int to,nxt;}ed[maxm];
inline void build(int u,int v){
ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;
ed[++ne] = (EDGE){u,h[v]}; h[v] = ne;
}
char s[45][45];
int X[4] = {0,0,-1,1},Y[4] = {-1,1,0,0};
int lk[maxn],vis[maxn],N,M,sx,sy,n;
int id[45][45],px[maxn],py[maxn],c[maxn],Out[maxn];
int win[maxn],ans[maxn],ansi;
int bd[maxn][maxn];
void dfs(int x,int y,int co){
id[x][y] = ++n; px[n] = x; py[n] = y; c[n] = co;
int nx,ny;
for (int k = 0; k < 4; k++){
nx = x + X[k];
ny = y + Y[k];
if (nx < 1 || ny < 1 || nx > N || ny > M || s[nx][ny] == s[x][y])
continue;
if (id[nx][ny]){
if (!bd[id[nx][ny]][id[x][y]]) build(id[x][y],id[nx][ny]);
bd[id[nx][ny]][id[x][y]] = bd[id[x][y]][id[nx][ny]] = true;
}
else {
dfs(nx,ny,co ^ 1);
if (!bd[id[nx][ny]][id[x][y]]) build(id[x][y],id[nx][ny]);
bd[id[nx][ny]][id[x][y]] = bd[id[x][y]][id[nx][ny]] = true;
}
}
}
bool find(int u){
Redge(u) if (!vis[to = ed[k].to] && !Out[to]){
vis[to] = true;
if (!lk[to] || find(lk[to])){
lk[to] = u; lk[u] = to;
return true;
}
}
return false;
}
int main(){
N = read(); M = read();
REP(i,N) scanf("%s",s[i] + 1);
REP(i,N) REP(j,M) if (s[i][j] == '.'){sx = i,sy = j,s[i][j] = 'X';break;}
dfs(sx,sy,0);
int K = read() << 1,x,y,nx = sx,ny = sy,u;
REP(i,n) if (!c[i]) cls(vis),find(i);
REP(i,K){
cls(vis);
x = read(); y = read();
Out[u = id[nx][ny]] = true;
if (lk[u]){
win[i] = !find(lk[u]);
if (win[i]) lk[lk[u]] = 0;
}
else win[i] = 0;
lk[u] = 0;
nx = x; ny = y;
}
win[K] = true;
for (int i = 1; i <= K; i += 2)
if (win[i] && win[i + 1]) ans[++ansi] = (i + 1) >> 1;
printf("%d\n",ansi);
REP(i,ansi) printf("%d\n",ans[i]);
return 0;
}

BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】的更多相关文章

  1. BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)

    首先将棋盘黑白染色,不妨令空格处为黑色.那么移动奇数次后空格一定处于白色格子,偶数次后空格一定处于黑色格子.所以若有某个格子的棋子颜色与棋盘颜色不同,这个棋子就是没有用的.并且空格与某棋子交换后,棋子 ...

  2. BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】

    题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...

  3. 【BZOJ2437】【NOI2011】兔兔与蛋蛋(博弈论,二分图匹配)

    [BZOJ2437][NOI2011]兔兔与蛋蛋(博弈论,二分图匹配) 题面 BZOJ 题解 考虑一下暴力吧. 对于每个状态,无非就是要考虑它是否是必胜状态 这个直接用\(dfs\)爆搜即可. 这样子 ...

  4. 【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论

    Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...

  5. 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)

    未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 442 Des ...

  6. bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势

    noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...

  7. 博弈论(二分图匹配):NOI 2011 兔兔与蛋蛋游戏

    Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...

  8. 2437: [Noi2011]兔兔与蛋蛋 - BZOJ

    Description Input 输入的第一行包含两个正整数 n.m.接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母" ...

  9. NOI2011 兔兔与蛋蛋游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2437 这道题真是极好的. 75分做法: 搜索. 出题人真的挺良心的,前15个数据点的范围都很小,可以 ...

随机推荐

  1. 32bit 天堂2 windows 2000 server架设教程

    服务器的软件要求: Microsoft Windows 2000 Server or advanced Server license 100 Microsoft SQL Server 2000 Ent ...

  2. IEEE1588 ( PTP ) 协议简介

    IEEE1588 协议,又称 PTP( precise time protocol,精确时间协议),可以达到亚微秒级别时间同步精度,于 2002 年发布 version 1,2008 年发布 vers ...

  3. 为什么找程序员一定要看他的 GitHub

    听说 最开始听到这句话是某知名互联网公司大牛告诉我的,我很不以为然,不过迫于他是"leader"我也注册了一个 highsea (广告 0.0):当然我可懒得 push 更别提 c ...

  4. TFS任务预览

    不太熟悉TFS任务项的建立. 初步建立及按老师要求分配到个人的任务设置与时间安排如下: (长时间任务可由多人合作完成,具体根据情况迅速调整任务分配) 加上每人需要进行阅读前一小组的代码需要时间2*8= ...

  5. 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】

    1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...

  6. 作业1MathExam

    自己取一个大气又可爱的标题 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 720 1000 ...

  7. java拓荒者

    因为是初学者 最近在看那个<java从入门到精通 韩顺平>的视频 觉得好不错 虽然视频的分辨率强差人意 但仍可接受 学知识嘛 用我们广东话说 :“鬼叫你穷,顶硬上” 韩老师的声音较好 课堂 ...

  8. 学习总结:jQuery插件开发模式和结构

    学习博客链接: ①https://www.cnblogs.com/cyStyle/ ② https://www.cnblogs.com/chengyunshen/p/7277305.html ③ ht ...

  9. 51单片机RAM 数据存储区学习笔记

    转自:http://www.eepw.com.cn/article/216237_2.htm 1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间.在keil中编写程序,如果当前 ...

  10. C语言中以十六进制输出字符型变量会出现'ffffff"的问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...