题目描述

一个n×n栅格是由n行和n列顶点组成的一个无向图,如图所示。用(i,j)表示处于第i行第j列的顶点。除了边界顶点(即满足i=1,i=n,j=1或j=n的顶点(i,j)),栅格中的所有其他顶点都有四个相邻的顶点。

给定栅格中的m≤n2个起始点(x1,y1),…, (xm,ym),逃脱问题即确定从起始顶点到边界上的任何m个相异的顶点之间,是否存在m条顶点不相交的路径。例如,图中左边的栅格包含了一个逃脱,黑点表示起始点,一个逃脱路径由灰线表示;而右边的栅格则没有逃脱。

现给定一个栅格的n和m,以及其中m个起始点的坐标,你只需要判断是否存在逃脱即可。

输入输出格式

输入格式:

输入文件为escape.in

第一行是一个整数,为n (n≤35)。

第二行还是一个整数,为m。

以下m行,第(i+2)行包含两个整数xi和yi,表示第i行第j列的点是起始点。输入数据保证不会出现起始点坐标相同的情况。

输出格式:

输出文件为escape.out

只包括一行。若存在逃脱输出’YES’,不存在逃脱输出’NO’。

输入输出样例

输入样例#1:

6
10
2 2
2 4
2 6
3 1
3 2
3 4
3 6
4 2
4 4
4 6
输出样例#1:

YES
 
 
网络流
#include <cstdio>
#include <queue>
#define N 5000005
using namespace std;
int dep[N],nextt[N<<],to[N<<],flow[N<<],head[N],cnt=,n,m,fx[]={,-,,},fy[]={,,-,};
inline void ins(int u,int v,int w)
{
nextt[++cnt]=head[u];
to[cnt]=v;
flow[cnt]=w;
head[u]=cnt;
}
bool bfs(int s,int t)
{
for(int i=s;i<=t;++i) dep[i]=-;
dep[s]=;
queue<int>q;
q.push(s);
for(int now;!q.empty();)
{
now=q.front();q.pop() ;
for(int i=head[now];i;i=nextt[i])
{
int v=to[i];
if(dep[v]==-&&flow[i])
{
dep[v]=dep[now]+;
if(v==t) return true;
q.push(v);
}
}
}
return false;
}
inline int min(int a,int b){return a>b?b:a;}
int dfs(int now,int t,int Limit)
{
if(now==t||!Limit) return Limit;
int ret=,f;
for(int i=head[now];i;i=nextt[i])
{
int v=to[i];
if(dep[v]==dep[now]+&&flow[i]&&(f=dfs(v,t,min(Limit,flow[i]))))
{
flow[i]-=f;
flow[i^]+=f;
ret+=f;
Limit-=f;
if(!Limit) break;
}
}
if(ret!=Limit) dep[now]=-;
return ret;
}
int Dinic(int S,int T)
{
int ret=;
for(;bfs(S,T);ret+=dfs(S,T,0x3f3f3f3f));
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
int S=,T=*n*n+;
for(int x,y,i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
ins(S,(x-)*n+y,);
ins((x-)*n+y,S,);
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int k=;k<;++k)
{
int u=i+fx[k],v=j+fy[k];
if(u>&&u<=n&&v>&&v<=n)
{
ins((i-)*n+j,(u-)*n+v,);
ins((u-)*n+v,(i-)*n+j,);
}
}
for(int i=;i<=n;++i) ins(i,T,),ins(T,i,);
for(int i=n*n-n+;i<=n*n;++i) ins(i,T,),ins(T,i,);
for(int i=n+;i<=n*n-n;i+=n) ins(i,T,),ins(T,i,);
for(int i=;i<=n;++i) ins(i*n,T,),ins(T,i*n,);
int ans=Dinic(S,T);
if(ans==m) printf("YES");
else printf("NO");
return ;
}

最新文章

  1. js闭包问题
  2. WP8:Unity3D之间的值传递
  3. 【WPF】FillRule
  4. SPOJ #440. The Turtle&#180;s Shortest Path
  5. git 秘钥的生成
  6. cxf2.7.10 与 spring3.0.5集成
  7. C语言之一数三平方
  8. Tomcat在Linux上安装
  9. checkbox 选择功能和反选
  10. 【IE6的疯狂之十三】IE6下使用滤镜后链接不能点击的BUG
  11. Gym 100917L Liesbeth and the String 规律&amp;&amp;胡搞
  12. Dapper-继续
  13. Something about SeekingJob---TelInterview(电话面试)
  14. 常用Latex公式
  15. RabbitMq入门以及使用教程
  16. xml合并工具【原】
  17. shell日常实战练习——通过监视用户登陆找到入侵者
  18. python创建MySQL多实例-1
  19. pig—WordCount analysis
  20. 92. Reverse Linked List II(链表部分反转)

热门文章

  1. Bind 远程连接DNS服务器时出现 rndc: connection to remote host closed
  2. lvs squid相关
  3. Ubuntu 16 Mysql 安装配置
  4. CentOS7 环境下MySQL5.7 PHP7的安装
  5. std::function&quot;函数&quot;对象包装器
  6. 黑科技抢先尝(续2) - Windows terminal中Powershell Tab的极简美化指南
  7. Linux shell 单引号和双引号
  8. MySQL学习中,遇到的问题记录
  9. ue4学习资料
  10. CentOS设置代理, yum, wget