Gym102361E Escape
Link
首先我们可以推出一些有用的结论:
1、任意两个机器人之间的路线不能重合,但是可以垂直交叉。
2、如果一个格子没有转向器,那么最多允许两个机器人以相互垂直的方向通过。
3、如果一个格子有转向器,那么一定有且仅有一个机器人通过。
考虑最大流模型。
我们将图中的每个点拆成两个,一个水平点和一个竖直点。这两个点之间有一条容量为\(1\)的双向边。
所有的水平点之间按水平的二连通相连,而所有的竖直点之间按竖直的而连通相连,流量均为\(1\)。
然后检查该图的最大流是否等于\(a\)即可。
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N=107,V=20007,E=130007,inf=1e9;
int s,t,tot=1,head[V],ver[E],next[E],edge[E],dep[V],cur[V],id[N][N];char str[N];std::queue<int>q;
int read(){int x;scanf("%d",&x);return x;}
void add(int u,int v,int f)
{
ver[++tot]=v,next[tot]=head[u],edge[tot]=f,head[u]=tot;
ver[++tot]=u,next[tot]=head[v],edge[tot]=0,head[v]=tot;
}
int bfs()
{
memset(dep+1,0x3f,t<<2),memcpy(cur+1,head+1,t<<2),dep[s]=0,q.push(s);
for(int i,u,v;!q.empty();) for(u=q.front(),q.pop(),i=head[u];i;i=next[i]) if(dep[v=ver[i]]>inf&&edge[i]) dep[v]=dep[u]+1,q.push(v);
return dep[t]<inf;
}
int dfs(int u,int lim)
{
if(!lim||u==t) return lim;
int v,flow=0;
for(int&i=cur[u],f;i;i=next[i])
if(dep[v=ver[i]]==dep[u]+1&&(f=dfs(v,std::min(lim,edge[i]))))
{
flow+=f,lim-=f,edge[i]-=f,edge[i^1]+=f;
if(!lim) break;
}
return flow;
}
int dinic()
{
int ans=0;
while(bfs()) ans+=dfs(s,inf);
return ans;
}
void solve()
{
memset(head+1,0,t<<2),memset(id,0,sizeof id),tot=1;
int n=read(),m=read(),a=read(),b=read(),cnt=0;
for(int i=1,j;i<=n;++i) for(scanf("%s",str+1),j=1;j<=m;++j) if(str[j]=='0') id[i][j]=++cnt;
s=cnt*2+1,t=s+1;
for(int i=1;i<=n;++i)
for(int j=1,u;j<=m;++j)
if(u=id[i][j])
{
add(u,u+cnt,1),add(u+cnt,u,1);
if(id[i-1][j]) add(u,id[i-1][j],1);
if(id[i+1][j]) add(u,id[i+1][j],1);
if(id[i][j-1]) add(u+cnt,id[i][j-1]+cnt,1);
if(id[i][j+1]) add(u+cnt,id[i][j+1]+cnt,1);
}
for(int i=1,x;i<=a;++i) if(id[1][x=read()]) add(s,id[1][x],1);
for(int i=1,x;i<=b;++i) if(id[n][x=read()]) add(id[n][x],t,1);
puts(dinic()==a? "Yes":"No");
}
int main(){for(int t=read();t;--t)solve();}
Gym102361E Escape的更多相关文章
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- 简单明了区分escape、encodeURI和encodeURIComponent
一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...
- c#模拟js escape方法
public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...
- 【BZOJ-1340】Escape逃跑问题 最小割
1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 264 Solved: 121[Submit] ...
- LYDSY热身赛 escape
Description 给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上矩形的行 ...
- javascript escape()函数和unescape()函数
javascript escape()函数和unescape()函数 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法: escape(string) stri ...
- HDU 3605 Escape(状压+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- escape,encodeURI,encodeURIComponent的区别
escape是对字符串进行编码而另外两种是对URL. encodeURI方法不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+'encodeURIComponent方法 ...
- C#针对js escape解码
在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...
随机推荐
- excel处理经纬度
=LEFT(A1,FIND("°",A1)-1)*1+MID(A1,FIND("°",A1)+1,2)/60+MID(A1,FIND("′" ...
- PHP笔记02
PHP数组 能够在一个变量存储多个值 取值用下标,下标从0开始计算 好处:在处理物品清单等大量相同属性的变量内容时可以集中存取 <?php $arr=array("like" ...
- springboot - 映射HTTP Response Status Codes 到 FreeMarker Error页面
1.总览 2.代码 1).pom.xml 这里注意:springboot 2.2.0以后默认的freemarker文件后缀为:ftlh.本例用的是2.2.1,所以后缀为ftlh <depende ...
- 项目版本回退后出现java compiler level does not match the version of the installed java project facet错误的解决
今天项目出问题了,采取了项目版本回退的方法解决了代码不能够下拉和上送的问题以后,出现如下错误,项目是微服务的,更新相关的依赖项目,仍得不到解决,检查mapper.xml文件亦没问题.然后在控制台那块发 ...
- 17. react redux的中间件
1. redux 数据流程图 View 会派发一个 Action Action 通过 Dispatch 方法派发给 Store Store 接收到 Action 连同之前的 State 发给 Red ...
- JVM探秘:jinfo查看JVM运行时参数
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 如何查看JVM运行时参数,对于线上JVM调优是很关键的,因为只有知道了当前使用的JVM ...
- jQuery课上笔记19.5.17
jQuery 选择器 $("*"):所有元素 $("#idname"):id="idname"的元素 $(".classname& ...
- ansible shell 之运行后台程序
最近在使用ansible shell模块启动一个shell编写的脚本,该脚本主要功能式加载java的classpath并在后台运行这个java程序. 该脚本在linux shell中可以正常启动和停止 ...
- Java版本和功能指南
您可以使用本指南查找和安装最新的Java,了解Java发行版(AdoptOpenJdk,OpenJDK,OracleJDK等)之间的差异,以及获得Java语言功能的概述,包括Java版本8-13. J ...
- mnist lenet caffe 测试
# -*- coding: utf-8 -*-import sysimport numpy as npimport structfrom PIL import Imageprint "hel ...