思路:

二分图博弈嘛 找到最大匹配的必须点

跑个网络流 前后DFS一遍

//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=105,M=105*105*35,inf=0x3f3f3f3f;
int n,m,id[N][N],cnt,T,vis[M/8],jy;
char ch[115][115],xx[]={1,-1,0,0},yy[]={0,0,1,-1};
struct Dinic{int first[M],next[M],v[M],w[M],tot,top,ans[M],color[M],recx[M],recy[M];void init(){memset(first,-1,sizeof(first));}void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}void build(){init(),T=cnt+1,color[T]=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(id[i][j]){recx[id[i][j]]=i,recy[id[i][j]]=j;if((i+j)&1){add(0,id[i][j],1),color[id[i][j]]=1;for(int k=0;k<4;k++){int dx=i+xx[k],dy=j+yy[k];if(id[dx][dy])add(id[i][j],id[dx][dy],1);}}else add(id[i][j],T,1);}flow();if(!cnt)puts("LOSE");else{puts("WIN");memset(vis,0,sizeof(vis)),dfs(0,1);memset(vis,0,sizeof(vis)),dfs(T,0);sort(ans+1,ans+1+top);for(int i=1;i<=top;i++)printf("%d %d\n",recx[ans[i]],recy[ans[i]]);}}bool tell(){memset(vis,-1,sizeof(vis));queue<int>q;q.push(0),vis[0]=0;while(!q.empty()){int t=q.front();q.pop();for(int i=first[t];~i;i=next[i])if(vis[v[i]]==-1&&w[i])vis[v[i]]=vis[t]+1,q.push(v[i]);}return ~vis[T];}int zeng(int x,int y){if(x==T)return y;int r=0;for(int i=first[x];~i;i=next[i])if(vis[v[i]]==vis[x]+1&&w[i]){int t=zeng(v[i],min(w[i],y-r));w[i]-=t,w[i^1]+=t,r+=t;}if(!r)vis[x]=-1;return r;}int flow(){while(tell())while(jy=zeng(0,inf))cnt-=jy*2;}void dfs(int x,int y){if(color[x]==y)ans[++top]=x;for(int i=first[x];~i;i=next[i])if(w[i]==y&&!vis[v[i]])vis[v[i]]=1,dfs(v[i],y);}
}dinic;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%s",ch[i]+1);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(ch[i][j]=='.')id[i][j]=++cnt;dinic.build();
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532704.html

BZOJ 1443 二分图博弈 网络流相关推荐

  1. [NOI2011]兔兔与蛋蛋游戏 二分图博弈

    题面 题面 题解 通过观察,我们可以发现如下性质: 可以看做是2个人在不断移动空格,只是2个人能移动的边不同 一个位置不会被重复经过 : 根据题目要求,因为是按黑白轮流走,所以不可能重复经过一个点,不 ...

  2. 2020CCPC(长春) - Combination Lock(二分图博弈)

    题目大意:给出一个密码锁,两个人一起玩游戏,给出初始的密码,规定: 每一次都可以转动一个位置的数字一个单位 不可以转动到已经出现过的数字 不可以转动到被 ban 掉的数字 无法转动的人视为失败,问谁能 ...

  3. BZOJ 1443: [JSOI2009]游戏Game

    1443: [JSOI2009]游戏Game Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1077  Solved: 484 [Submit][S ...

  4. BZOJ 1059 - 二分图匹配

    之前一直把矩阵的元素以为是给定的\(m\)以内- 然后才发现- ​ 哔了狗了- ​ 二分图匹配咯- 如果第\(i\)行第\(j\)列是黑色,那么在代表这一行和这一列的两个节点之间连边.然后匈牙利算法跑 ...

  5. BZOJ 4025 二分图

    题目大意 给定一个\(n\)个点, \(m\)条边的无向图, 每条边在一定时间范围内存在. 要你判断每个时间点这张图是否为二分图. \(n \le 10^5\) \(m \le 2 \times 10 ...

  6. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  7. 【LOJ6033】棋盘游戏【二分图博弈】

    传送门 显然是个二分图,设开始位置是左边,另一边是右边 那么先手是把左边挪到右边,后手是把右边挪到左边,不能挪的那方失败 结论:Alice必胜当且仅当开始位置不一定在最大匹配上 必要性: 如果开始位置 ...

  8. [BZOJ 4025] 二分图

    题目传送-BZOJ4025 题意: 有一张\(n\)个节点的无向图,其中边\(i\)在\(s_i\)出现,\(e_i\)结束,并连接着节点\(x,y\). 并保证\(s_i < e_i \le ...

  9. bzoj 4131: 并行博弈(博弈)

    4131: 并行博弈 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 42  Solved: 29 [Submit][Status][Discuss] ...

最新文章

  1. Microbiome:微生物所刘双江组建立人肠道微生物资源库(hGMB)
  2. 申报成功后怎样修改_【小白教程】12月第3期《申报成功后,如何更正,快快收藏!》...
  3. 第三十一讲 非线性微分自治方程组及图解
  4. Spring Boot2.x-09 基于Spring Boot 2.1.2 + Mybatis使用自定义注解实现数据库切换
  5. Basic链表与队列的区别
  6. http请求在asp.net中的应用
  7. 洛谷 题解 P1135 【奇怪的电梯】
  8. DSP28335串口打印 printf
  9. 关于BS7799-3
  10. C语言图书购销管理系统流程图,图书销售管理系统C语言程序报告精选.doc
  11. OpenGL(十三) Alpha测试、剪裁测试
  12. 2023年浙大MEM英语二作文干货模版:临阵磨枪可用
  13. Kerberos认证协议
  14. 国外打工人分享如何如何通过销售excel电子表格赚到 28 万美元
  15. 佳音图php,PHP5实例教程 简简单单生成条形码
  16. 安装ROS2 humble 和 cartographer
  17. springboot整合jsp模板
  18. 长安链ChainMaker的多链隔离设计
  19. 使用selenium 刷票
  20. Linux云计算网络服务CentOS7.5

热门文章

  1. [BUUCTF-pwn]——picoctf_2018_got_shell
  2. 74 计算机图形学开源处理库
  3. Spring 学习二-----AOP的原理与简单实践
  4. Vagrant使用简介
  5. Android 定时器实现的几种方式和removeCallbacks失效问题详解
  6. HttpModule
  7. c#语法之lock 语句
  8. step2 . day7 C语言阶段小的项目总结
  9. springmvc学习笔记--ueditor和springmvc的集成
  10. dubbo启动时检查服务