Link

首先我们可以推出一些有用的结论:

1、任意两个机器人之间的路线不能重合,但是可以垂直交叉。

2、如果一个格子没有转向器,那么最多允许两个机器人以相互垂直的方向通过。

3、如果一个格子有转向器,那么一定有且仅有一个机器人通过。

考虑最大流模型。

我们将图中的每个点拆成两个,一个水平点和一个竖直点。这两个点之间有一条容量为\(1\)的双向边。

所有的水平点之间按水平的二连通相连,而所有的竖直点之间按竖直的而连通相连,流量均为\(1\)。

然后检查该图的最大流是否等于\(a\)即可。

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. const int N=107,V=20007,E=130007,inf=1e9;
  6. 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;
  7. int read(){int x;scanf("%d",&x);return x;}
  8. void add(int u,int v,int f)
  9. {
  10. ver[++tot]=v,next[tot]=head[u],edge[tot]=f,head[u]=tot;
  11. ver[++tot]=u,next[tot]=head[v],edge[tot]=0,head[v]=tot;
  12. }
  13. int bfs()
  14. {
  15. memset(dep+1,0x3f,t<<2),memcpy(cur+1,head+1,t<<2),dep[s]=0,q.push(s);
  16. 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);
  17. return dep[t]<inf;
  18. }
  19. int dfs(int u,int lim)
  20. {
  21. if(!lim||u==t) return lim;
  22. int v,flow=0;
  23. for(int&i=cur[u],f;i;i=next[i])
  24. if(dep[v=ver[i]]==dep[u]+1&&(f=dfs(v,std::min(lim,edge[i]))))
  25. {
  26. flow+=f,lim-=f,edge[i]-=f,edge[i^1]+=f;
  27. if(!lim) break;
  28. }
  29. return flow;
  30. }
  31. int dinic()
  32. {
  33. int ans=0;
  34. while(bfs()) ans+=dfs(s,inf);
  35. return ans;
  36. }
  37. void solve()
  38. {
  39. memset(head+1,0,t<<2),memset(id,0,sizeof id),tot=1;
  40. int n=read(),m=read(),a=read(),b=read(),cnt=0;
  41. 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;
  42. s=cnt*2+1,t=s+1;
  43. for(int i=1;i<=n;++i)
  44. for(int j=1,u;j<=m;++j)
  45. if(u=id[i][j])
  46. {
  47. add(u,u+cnt,1),add(u+cnt,u,1);
  48. if(id[i-1][j]) add(u,id[i-1][j],1);
  49. if(id[i+1][j]) add(u,id[i+1][j],1);
  50. if(id[i][j-1]) add(u+cnt,id[i][j-1]+cnt,1);
  51. if(id[i][j+1]) add(u+cnt,id[i][j+1]+cnt,1);
  52. }
  53. for(int i=1,x;i<=a;++i) if(id[1][x=read()]) add(s,id[1][x],1);
  54. for(int i=1,x;i<=b;++i) if(id[n][x=read()]) add(id[n][x],t,1);
  55. puts(dinic()==a? "Yes":"No");
  56. }
  57. int main(){for(int t=read();t;--t)solve();}

Gym102361E Escape的更多相关文章

  1. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  2. 简单明了区分escape、encodeURI和encodeURIComponent

    一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...

  3. c#模拟js escape方法

    public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...

  4. 【BZOJ-1340】Escape逃跑问题 最小割

    1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 264  Solved: 121[Submit] ...

  5. LYDSY热身赛 escape

    Description 给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上矩形的行 ...

  6. javascript escape()函数和unescape()函数

    javascript escape()函数和unescape()函数 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法: escape(string) stri ...

  7. HDU 3605 Escape(状压+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  8. escape,encodeURI,encodeURIComponent的区别

    escape是对字符串进行编码而另外两种是对URL. encodeURI方法不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+'encodeURIComponent方法 ...

  9. C#针对js escape解码

    在javascript 中通常用escape与unescape进行编码以方便传输. 在asp.net页面接收到这些数据以后可以使用 Microsoft.JScript.GlobalObject.une ...

随机推荐

  1. JVM探秘:jstack查看Java线程状态

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个 ...

  2. 联系我们地图坐标展示js

    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=6d88 ...

  3. postman测试带有json数据格式的字段

    测试六个字段 普通字段: ModelCode 普通字段: MmodelCode 普通字段: ModelTagKey 普通字段: ModelTagValue 普通字段: ModelTagType jso ...

  4. 对近期docker学习的总结

    Docker 总结 1. 说在前头(Docker命令的格式) docker中的对象分为4个(就目前我所学到的) 镜像 image 容器 container 网络 network 数据卷 volume ...

  5. mybatis今年笔记

    1.读取配置文件:用的就是解析Xml文件的技术 2.mybatis是支持自己写dao层的,但是没有必要. mybatis做的事情: 第一个创建代理对象,第二个在代理对象中调用方法. 3.相同的注解如果 ...

  6. Android file内部存储

    通过file=openFileOutput()获得,将数据存储在data/data/+包名+files下面. 代码如下: MainActivity.java: import android.os.Bu ...

  7. OnPaint中画图遇到的问题

    在OnPaint函数中有CPaintDC dc1(this);这句话,在画图时,千万不要把它去掉,否则会造成消息队列阻塞.例如定时器.Invalidate()等都会失效. 造成这种现象的原因是: CP ...

  8. stm32h7 hal 库的学习

    stm32h7xx_hal_conf.h 中需要注意的几个地方: HSE_VALUE 这个外接晶振的频率 TICK_INT_PRIORITY 这个 tick 的中断优先级,因为 HAL_DELAY 这 ...

  9. C#调用C++系列二:传结构体

    这一篇记录下C#调用C++的结构体的方式来使用OpenCV的数据格式,这里会有两种方式,第一种是C#传一个结构体和图像的路径给C++,然后C++将图像加载进来,再把传进来的结构体填满即可,第二种是C# ...

  10. Centos下nginx安装

    安装很简单,这里记录只是为了记下下载地址: A.[root@localhost soft]# wget http://nginx.org/download/nginx-1.4.2.tar.gz B.[ ...