传送门
思路:
很巧妙的思路
将二分图的匹配与博弈相联系
给出定理:

若二分图中去掉起点后仍存在最大匹配(与先前的最大匹配数相等),那么先手必输;反之先手必胜

关于证明,我昨天晚上和今天中午想了很久,随便口胡一下

先考虑起点一定在最大匹配中(即定理中所说的’先手必胜’情况)的情况:
那么只要先手只要移到起点的匹配点就可以了
因为显然走的边是匹配边->非匹配边->匹配边->非匹配边…
如果表示一对匹配点为(xi,yi)(x_i,y_i)的话(设起点为x1x_1)
那么走的点就是x1−>y1−>x2−>y2...x_1->y_1->x_2->y_2...
也就是说只要对手(在y点)找到了一个(x点)
那么我们(在x点)一定可以走当前点的匹配点
最终肯定是对手输
会不会对手(在y点)不走到x点?也就是说对手走了一条非匹配边到达了非匹配点
显然是不能的
因为这样的话把之前路径上的匹配边变成非匹配边,非匹配边变成匹配边,这又是一个最大匹配,同时起点也不再是匹配点,这与给出的条件’起点一定在最大匹配中’矛盾,所以不成立

再考虑’先手必输’的情况
在这种情况下,我们可以把起点看做一个非匹配点
只能从起点出发走到一个已匹配点中,这个已匹配点一定在删除起点的二分图中的最大匹配里(至于证明的话,因为如果该点不在最大匹配中,那么起点和该点在原图中构成一个新的匹配,而原图匹配数应该等于现图匹配数,所以’该点不在最大匹配’不成立)
然后就转化成上面先手必胜的情况了

证毕

然后就可以暴力枚举一下了……
好像会T,不管了,压了压常数,跑了6000ms+……
注意每次跑匈牙利之前要清空vis数组,而且每次删除完点后还要再加进去,也就是再跑一遍匈牙利就可以了
代码:

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,tot,cnt;
bool vis[10003],del[10003];
int a[103][103],id[103][103],first[10003],belong[10003],ax[10003],ay[10003];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
struct edge{int v,next;
}e[40005];
int in()
{char c=getchar();while (c!='.'&&c!='#') c=getchar();if (c=='.') return 1;return 0;
}
void add(int u,int v){e[++tot]=(edge){v,first[u]};first[u]=tot;}
bool find(int x)
{if (del[x]) return 0;for(int i=first[x];i;i=e[i].next)if (!del[e[i].v]&&!vis[e[i].v]){vis[e[i].v]=1;if (!belong[e[i].v]||find(belong[e[i].v])){belong[e[i].v]=x;belong[x]=e[i].v;return 1;}}return 0;
}
main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j){a[i][j]=in();if (a[i][j])id[i][j]=++cnt;}for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)if (id[i][j])for (int k=0;k<4;++k)if (id[i+dx[k]][j+dy[k]])add(id[i][j],id[i+dx[k]][j+dy[k]]);for (int i=1;i<=cnt;++i)if (!belong[i]) memset(vis,0,sizeof(vis)),find(i);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)if (id[i][j]){int tmp=belong[id[i][j]];belong[id[i][j]]=belong[tmp]=0;del[id[i][j]]=1;memset(vis,0,sizeof(vis));if (!tmp||find(tmp)){ax[++ax[0]]=i,ay[ax[0]]=j;memset(vis,0,sizeof(vis));find(id[i][j]);}else belong[tmp]=id[i][j],belong[id[i][j]]=tmp;del[id[i][j]]=0;}if (ax[0]) puts("WIN");else puts("LOSE");for (int i=1;i<=ax[0];++i) printf("%d %d\n",ax[i],ay[i]);
}

【BZOJ1443】游戏Game,博弈+二分图匹配相关推荐

  1. 【BZOJ2437】【codevs1949】兔兔与蛋蛋游戏,博弈+二分图匹配

    传送门1 传送门2 思路: 关于证明 算是bzoj1443的强化版吧 但我是先写的这道题再写的bzoj1443,所以刚开始比较懵逼 二分图中的点是空格.与空格坐标和的奇偶相同的黑点.坐标和奇偶不同的白 ...

  2. 【二分图匹配】矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  3. 洛谷P1640 连续攻击游戏 二分图匹配

    给出n≤1e6n\leq1e6n≤1e6个装备,每个装备都有两个属性值,它的范围一定在[1,10000][1,10000][1,10000],你每个装备只能选择一个属性值,然后要求出最长的一段从111 ...

  4. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  5. BZOJ 1191: [HNOI2006]超级英雄Hero 二分图匹配

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4430  Solved: 2036 [Submit ...

  6. HDU 3081 Marriage Match II (并查集+二分+最大流 | 并查集+二分图匹配)

    题意:n 个男生.n个女生玩游戏,每个女生都可以和她不讨厌的男生结婚,此外她的朋友如果也不讨厌这个男生,也可以和他结婚:对于女生,如果A和B是朋友,B和C是朋友,那么A和C也是朋友.每次游戏女生会找一 ...

  7. 棋盘游戏 (二分图匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  9. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

最新文章

  1. 【PDF下载】无意中发现的另一本 统计学入门好书
  2. vue 热更新无反应_不吹不黑谈谈 vue 的 SFC 和 template
  3. 软考自查:多媒体基础知识
  4. JS URL 编码 PHP 解码{%u5F00%u53D1}
  5. android如何设置多条广播,Android使用MulticastSocket实现多点广播图片
  6. hikvision v2.3控件网页demo_《快速掌握PyQt5》第三十章 网页交互QWebEngineView
  7. 性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常
  8. python换行不执行_PYTHON无法换行问题,求指点
  9. 6大设计原则之开闭原则
  10. openssl req
  11. 物化视图的刷新方式说明
  12. MySQL操作之条件,排序,分页,聚合函数,分组,连接,子查询,自连接查询总结...
  13. 互联网创业项目失败的7大特征
  14. 基于asp网上书店购物商城计算机毕业设计网站作品
  15. Java开源框架Netty
  16. HTML5 Metadata content(文档元数据)
  17. 【转】模糊测试(fuzzing)是什么
  18. 论文不记之《StyleNet: Generating Attractive Visual Captions with Styles》
  19. 前字节跳动程序员 28 岁提前退休引热议,网友:我也想
  20. 物流计算机流程图,物流管理流程图.doc

热门文章

  1. 【华为云技术分享】《跟唐老师学习云网络》—ARP你在哪
  2. 野生前端的数据结构练习(11)动态规划算法
  3. AOS编排语言系列教程(一):开启AOS之旅,解锁各种自动化姿势
  4. Linux环境下如何计算CPU占用率
  5. mysql note级别_Mysql5.7 的错误日志中最常见的note级别日志解释
  6. java mysql 常见框架_Java岗面试重点:Java+JVM+MySQL+框架+算法,金九银十涨薪全靠它...
  7. c语言基础程序设计报告,c语言程序设计基础课程设计报告.doc
  8. 红橙Darren视频笔记 面试题 为什么view获取宽高为0 onCreate onResume view.post源码浅析(继承activity api27)
  9. 韩顺平php视频笔记79 80 错误和异常处理的机制 错误处理器 错误触发器
  10. hibernate 调用oracle存储过程,hibernate调用oracle存储过程||函数