P4055-[JSOI2009]游戏【网络流,博弈】

正题

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


题目大意

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


解题思路

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

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

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


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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【贪心】逃跑(jzoj 1748)

逃跑 jzoj 1748 题目大意 你有一个能量值l&#xff0c;在接下来的n天里&#xff0c;你每天有两个选择&#xff1a; 1、增加l个食物 2、使l加一&#xff0c; 你第i天要吃ai个a_i个ai​个食物&#xff0c;如果吃不到就会死掉&#xff0c;现在问你n天后你能活下去吗&#xff0c…

c#中关于协变性和逆变性(又叫抗变)帮助理解

今天回忆了之前看的《深入理解C#》这本书中的泛型章节&#xff0c;其中对泛型的可变性的理解。泛型可变性分两种&#xff1a;协变和逆变。逆变也又称为抗变。怎么理解这两个名词的意思&#xff1a;①&#xff1a;协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思…

「木」迷雾森林

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 赛时提示&#xff1a;保证出发点和终点都是空地 帕秋莉掌握了一种木属性魔法 这种魔法可以生成一片森林&am…

【单调队列】【DP】城市交通(jzoj 1749)

城市交通 jzoj 1749 题目大意 有n个点&#xff0c;x到y的前提是x<y,代价是(y−x)∗axby(y-x)*a_xb_y(y−x)∗ax​by​&#xff0c;问从1到n的最小代价是多少 输入样例 4 2 9 5 4 9 1 2 2输出样例 8数据范围 对于20%的数据&#xff0c;1⩽n⩽100&#xff1b;1\leqslan…

P5546-[POI2000]公共串【SAM】

正题 题面链接:https://www.luogu.com.cn/problem/P5546 题目大意 求nnn个串的最长公共子串。 解题思路 注意到最长公共子串一定是其中所有的子串&#xff0c;所以我们可以先随意对一个串构建SAMSAMSAM然后将信息存在上面即可。 然后每一个其他串都丢到那个SAMSAMSAM上跑匹…

C# 7.0中的解构功能---Deconstruct

解构元组C#7.0新增了诸多功能&#xff0c;其中有一项是新元组(ValueTuple)&#xff0c;它允许我们可以返回多个值&#xff0c;并且配合解构能更加方便的进行工作&#xff0c;如下面例子可以看到解构元组可以写出优雅的代码&#xff0c;并且可以使用类型推断&#xff0c;但在这里…

csp初赛复习(往年真题+解析)

排序算法 前缀/后缀表达式 二进制补码、反码 最短路 图片/音频/视频文件格式 前序/中序/后序遍历 以比较作为基本运算&#xff0c;在 N 个数中找最小数的最少运算次数为&#xff08; &#xff09;。 A. NNN B. N−1N-1N−1 C. N2N^2N2 D. logNlogNlogN 正确答案&#xff1a; B …

纪中B组模拟赛总结(2020.2.7)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3141414lyflyflyf190190190100100100909090000 总结 T1看了一会看出是二进制&#xff0c;就敲了出来 T2想不到正解&#xff0c;就敲了一个暴力&#xff0c;竟水到了90分&#xff0c;正解是要有撤回的贪心 T3以为…

CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】

正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树&#xff0c;从xxx跳到yyy&#xff08;要求yyy在xxx的子树中&#xff09;会产生Ax∗ByA_x*B_yAx​∗By​的代价&#xff0c;求每个节点出发跳到某个叶节点的最小代价。 解题思路 考虑dpdpdp的…

ASP.NET Core 2.1中基于角色的授权

授权是来描述用户能够做什么的过程。例如&#xff0c;只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用&#xff0c;需要身份验证机制。对于应用程序来说&#xff0c;首先需要进行…

CF449B Jzzhu and Cities(Dijkstra)

设每个点到1的距离为dis[x]dis[x]dis[x],特殊边为(1,vi,wi)(1,v_i,w_i)(1,vi​,wi​) 1、wi>dis[vi]w_i>dis[v_i]wi​>dis[vi​]的特殊边可以删除 2、widis[vi]且num[vi]>1w_idis[v_i]且num[v_i]>1wi​dis[vi​]且num[vi​]>1,特殊边可以删掉 思路上的偏差&…

Sunscreen

来源&#xff1a;牛客网 Sunscreen 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must co…

【dfs】无穷迷宫(jzoj 3924)

无穷迷宫 jzoj 3924 题目大意 有一个n*m的迷宫&#xff0c;有墙&#xff08;#&#xff09;&#xff0c;路&#xff08;.&#xff09;&#xff0c;和你的位置&#xff08;S&#xff09;&#xff0c;这个迷宫会复制无数份拼在一起&#xff0c;问你能不能不停地走下去 输入样例…

[2020.11.27NOIP模拟赛]拼图王【dp】

正题 题面链接:https://www.luogu.com.cn/problem/U142584 题目大意 nnn个010101串&#xff0c;按顺序分成两个序列&#xff0c;然后拼接成一个序列&#xff08;拼接串x,yx,yx,y的话就是变成一个前缀包含xxx&#xff0c;后缀包含yyy的最短的串&#xff09;。求最短长度。 解题…

分布式事务一致性解决方案

一、从数据一致性谈起↑一致性问题&#xff0c;“万恶之源”是数据冗余和分布并通过网络交互网络异常是常态。1、数据一致性的情形主库、从库和缓存数据一致性&#xff0c;相同数据冗余&#xff0c;关系数据库&#xff0c;为保证关据库的高可用和高性能&#xff0c;一般会采用主…

hihocoder1147 时空阵(bfs树+DP)

bfs树中&#xff0c;边只存在于同一层或相邻层的点之间 设f[i][j][k]f[i][j][k]f[i][j][k]为前iii层一共使用jjj个节点&#xff0c;其中第iii层有kkk个节点的合法方案&#xff0c;转移枚举每一层的连边方式&#xff0c;做到第LLL层即可。对于LLL 层之后的边可以随便乱连。&…

牛客网【每日一题】4月21日题目精讲 糖糖别胡说,我真的不是签到题目

试题 糖糖别胡说&#xff0c;我真的不是签到题目 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c; 其他语言262144K 64bit IO Format:%lld 题目描述 从前&#xff0c;有n只萌萌的糖糖&#xff0c;他们分成了两组一起玩游戏。…

近似乘积(jzoj 3925)

近似乘积 jzoj 3925 题目大意 给你一个集合A和n让你求不在集合A内的x、y、z&#xff0c;使∣n−xyz∣|n-xyz|∣n−xyz∣最小 输入样例 3 2 2 4 4 1 1 7 2 1 15 90输出样例 1 1 3 2 2 2 2 5 9数据范围 40% 的数据&#xff1a;1⩽m⩽10&#xff0c;1⩽n⩽100.1 \leqslant …

[2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId37855 题目大意 nnn个数&#xff0c;求所有区间中位数的中位数。 解题思路 二分一个答案&#xff0c;然后如果一个区间的中位数≥mid\geq mid≥mid&#xff0c;那么这个区间一定是≥mid\geq mid≥mid的数比…

.net core 生成二维码

其实生成二维码的组件有很多种&#xff0c;如&#xff1a;QrcodeNet&#xff0c;ZKWeb.Fork.QRCoder&#xff0c;QRCoder等我选QRCoder&#xff0c;是因为小而易用、支持大并发生成请求、不依赖任何库和网络服务。既然是.net core 那当然要用依赖注入&#xff0c;通过构造函数注…