正题

题目链接:https://www.luogu.com.cn/problem/P4055


题目大意

n∗mn*mn∗m的网格有的不能走,走过的不能走。开始有一个棋子先手可以决定位置,然后后先手轮流走,不能走的就输了,求先手的必胜开始位置。


解题思路

我们将图二分图染色,然后可以走的两两连边。如果这张图有完全匹配,那么可以发现无论先手走到哪个点,后手可以顺着完全匹配的边走,因为这个边一定是先手没有走过的。

如果图没有完全匹配,考虑胜负情况。此时对于一个匹配来说,图上会有一些点删除后不会影响最大匹配,如果先手选择了这些不需要的点作为起点,那么后手无论走到哪先手就可以顺着最大匹配的方法走了。

现在问题是考虑如何求出所有最大匹配的不需要点,我们可以先跑一遍网络流。然后从源点出发走没有流完的边,这些边可以作为当前匹配没有匹配的边或者增广路,然后走到的所有左边的点就是答案。而汇点同理,走流完的边即可,走到的右边的点就是答案。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define p(x,y) ((x)-1)*m+(y)
using namespace std;
const int N=110*110,inf=2147483647/3;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
struct node{int to,next,w;
}a[N<<3];
int n,m,s,t,tot=1,ls[N],dep[N],col[N];
bool v[110][110],flag,ans[N];char st[110];
queue<int> q;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;return;
}
bool bfs(){while(!q.empty())q.pop();q.push(s);memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){int rest=0,k;if(x==t)return flow;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow)return flow;}if(!rest)dep[x]=0;return rest;
}
void dfs(int x,int c){if(dep[x])return;dep[x]=1;if(col[x]==c)ans[x]=flag=1;for(int i=ls[x];i;i=a[i].next)if(a[i].w==c)dfs(a[i].to,c);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",st+1);for(int j=1;j<=m;j++)v[i][j]=(st[j]=='#');}s=0;t=p(n,m)+1;col[s]=col[t]=-1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(!v[i][j]){if((i+j)&1)addl(p(i,j),t,1),col[p(i,j)]=0;else{addl(s,p(i,j),1),col[p(i,j)]=1;for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(x<1||y<1||x>n||y>m||v[x][y])continue;addl(p(i,j),p(x,y),1);}}}}while(bfs())dinic(s,inf);memset(dep,0,sizeof(dep)); dfs(s,1);dfs(t,0);if(!flag)return printf("LOSE")&0;printf("WIN\n");for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(ans[p(i,j)])printf("%d %d\n",i,j);return 0;
}

P4055-[JSOI2009]游戏【网络流,博弈】相关推荐

  1. P4055 [JSOI2009]游戏(二分图匹配+博弈)

    P4055 [JSOI2009]游戏 对于一个网格,上面有一些障碍物不能走,A选择起点,然后B走到相邻的四个格子之一,然后轮流移动不能移动的一方失败.求解所有可以赢的初始位置. 首先对于这个问题要想到 ...

  2. P4055 [JSOI2009]游戏

    传送门 把这个图给黑白染色然后建二分图,如果有完备匹配那么就gg,否则放在所有的非匹配点都可以 简单来说的话就是放在非匹配点,那么对手的下一步必定移到一个匹配点,然后自己可以把它移到这个匹配点所匹配的 ...

  3. BZOJ 1443: [JSOI2009]游戏Game

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

  4. 如何赢得数学游戏(博弈问题)

    数学游戏(博弈问题)是最优化问题中的一类,同时它也是一类很有趣的逻辑推理问题.其中运用最广的思维是:倒推思维. 例1.桌子上有24根火柴,甲.乙两人轮流取,每人每次取1-3根.谁取到最后一根谁就获胜. ...

  5. LeetCode 810. 黑板异或游戏(博弈推理)

    1. 题目 一个黑板上写着一个非负整数数组 nums[i] . 小红和小明轮流从黑板上擦掉一个数字,小红先手. 如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败 ...

  6. 【BZOJ3729】Gty的游戏,博弈+splay

    传送门 挺蛋疼的一道题 连想带做搞了一晚上晚自习+下午两节课 博弈方面还是很好弄的,就是"阶梯问题"+"Nim取模游戏" 分别维护深度为奇数和偶数的节点的sg函 ...

  7. HDU2516 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. POJ1067 HDU1527 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. 蓝桥杯---试题 历届试题 填字母游戏(博弈)

    试题 历届试题 填字母游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏 ...

最新文章

  1. 【学习笔记】Android 图像处理
  2. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(二)
  3. 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入
  4. apache camel 相关配置_小白在 linux 系统部署apache、mysql、Laravel 环境学习笔记!
  5. 一款在线工具,克服Python、Java等7种语言编程障碍
  6. P2278 [HNOI2003]操作系统
  7. html5新变化,HTML5的新变化,分享
  8. 玩转 Linux 常用命令
  9. python __future__ 的几种特性
  10. pycharm新项目加载库的方法
  11. 【渝粤教育】电大中专Office办公软件 (3)作业 题库
  12. 多标签文本分类/三种神经网络/网络模型
  13. 《CSS权威指南》读书笔记3
  14. 三.Java基本语法
  15. 其实读一读,真的安静了
  16. 2021-09-13 多组EQ切换
  17. 赵丽颖冯绍峰结婚官宣!深扒2人10亿商业关系:女方年入过亿,男方是乐视股东...
  18. Jenkins SonarQube Quality Gate质量门禁检查
  19. 大陆中文网站流量排名前100
  20. Spring Boot 整合——Spring batch重试和回滚

热门文章

  1. chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
  2. 加时间水印_如何在手机照片上添加时间和日期?打开这个设置即可添加,超方便...
  3. linux删除第二列为空_Linux之基本文本处理工具(二)
  4. handler原子锁_Linux的原子操作与同步机制
  5. python网页动图_python,tensorflow线性回归Django网页显示Gif动态图
  6. oracle类似isempty,NULLs和empty strings在不同数据库的中特点
  7. linux磁盘写保护怎么修改_mount: /dev/vdb 写保护,将以只读方式挂载
  8. java 配置参数_给你的JAVA程序配置参数(Properties的使用)
  9. leetcode309. 最佳买卖股票时机含冷冻期
  10. Jdbc连接mysql的五种连接方式