[CCPC2019秦皇岛] E. Escape
[CCPC2019秦皇岛E] Escape
Link
https://codeforces.com/gym/102361/problem/E
Solution
观察到性质若干然后建图跑最大流即可。
我的 ISAP 被卡了,换成 Dinic 却过了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
const int inf = 1e+9;
#define reset(x) memset(x,0,sizeof x)
int dis[maxn], ans, cnt = 1, s, t, pre[maxn * 10], nxt[maxn * 10], h[maxn], v[maxn * 10];
std::queue<int> q;
void make(int x, int y, int z) {
pre[++cnt] = y, nxt[cnt] = h[x], h[x] = cnt, v[cnt] = z;
pre[++cnt] = x, nxt[cnt] = h[y], h[y] = cnt;
}
bool bfs() {
memset(dis, 0, sizeof dis);
q.push(s), dis[s] = 1;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = h[x]; i; i = nxt[i])
if (!dis[pre[i]] && v[i])
dis[pre[i]] = dis[x] + 1, q.push(pre[i]);
}
return dis[t];
}
int dfs(int x, int flow) {
if (x == t || !flow)
return flow;
int f = flow;
for (int i = h[x]; i; i = nxt[i])
if (v[i] && dis[pre[i]] > dis[x]) {
int y = dfs(pre[i], min(v[i], f));
f -= y, v[i] -= y, v[i ^ 1] += y;
if (!f)
return flow;
}
if (f == flow)
dis[x] = -1;
return flow - f;
}
int T,n,m,a,b,p[105],e[105];
char c[105][105];
int calch(int i,int j)
{
return 3+((i-1)*m+j-1)*2;
}
int calcv(int i,int j)
{
return 4+((i-1)*m+j-1)*2;
}
int calcx(int i,int j)
{
return 3+2*n*m+((i-1)*m+j-1);
}
int calcy(int i,int j)
{
return 3+3*n*m+((i-1)*m+j-1);
}
signed main()
{
ios::sync_with_stdio(false);
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&m,&a,&b);
reset(dis); reset(pre); reset(nxt); reset(h); reset(v); cnt=1;
//cout<<calch(n,m)<<" "<<calcv(n,m)<<" "<<calcx(n,m)<<" "<<calcy(n,m)<<endl;
for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
for(int i=1;i<=a;i++) scanf("%d",&p[i]);
for(int i=1;i<=b;i++) scanf("%d",&e[i]);
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='0' && c[i+1][j]=='0')
make(calcv(i,j),calcv(i+1,j),1),
make(calcv(i+1,j),calcv(i,j),1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m-1;j++)
if(c[i][j]=='0' && c[i][j+1]=='0')
make(calch(i,j),calch(i,j+1),1),
make(calch(i,j+1),calch(i,j),1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='0')
make(calch(i,j),calcv(i,j),1),
make(calcv(i,j),calch(i,j),1);
for(int i=1;i<=a;i++) if(c[1][p[i]]=='0') make(1,calcv(1,p[i]),1);
for(int i=1;i<=b;i++) if(c[n][e[i]]=='0') make(calcv(n,e[i]),2,1);
s=1;t=2;
ans = 0;
for (; bfs(); ans += dfs(s, inf));
if(ans == a) printf("Yes\n");
else printf("No\n");
}
}
[CCPC2019秦皇岛] E. Escape的更多相关文章
- [CCPC2019秦皇岛] F. Forest Program
[CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林 ...
- 2019CCPC 秦皇岛 E.Escape
传送门 题意: 给出一个\(n*m\)的迷宫,有\(a\)个入口,\(b\)个出口. 现在有\(a\)个机器人都从入口出发,一开始方向默认为下,你可以选在在一些格子上面放置一个转向器,转向器有四种: ...
- Codeforces Gym 102361A Angle Beats CCPC2019秦皇岛A题 题解
题目链接:https://codeforces.com/gym/102361/problem/A 题意:给定二维平面上的\(n\)个点,\(q\)次询问,每次加入一个点,询问平面上有几个包含该点的直角 ...
- 2019CCPC秦皇岛 E题 Escape(网络流)
Escape Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- 2019-ccpc秦皇岛现场赛
https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...
- 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] ...
随机推荐
- 浏览器对象模型“BOM”-- window对象
global对象 全局对象 所有的全局变量和全局方法,都可以归在window上 <!DOCTYPE html> <html lang="en"> <h ...
- JavaScript的语法、数据类型、基本算数和逻辑运算操作
str.toString() 可以把字符串.数值.布尔值.对象转为字符串 String(str) 任何数值强制转换为字符串类型 <!DOCTYPE html> <html lang= ...
- 剑指offer-面试题32-分行从上到下打印二叉树-二叉树遍历
/* 题目: 分行按层自上向下打印二叉树. */ /* 思路: 使用队列,将节点压入队列中,再弹出来,压入其左右子节点,循环,直到栈为空. 添加两个计数器,current记录当前行的节点数,next记 ...
- 在服务器上安装并配置JDK1.8
参考链接:https://blog.csdn.net/qq_40958000/article/details/83996912
- gdck01
有好几年 好几年 好几年 我成天在抱怨 我没钱 我没钱 恨老天不开眼 不开眼 不开眼 为什么好的事 都跟我没有缘
- Python_2_daythree2_CyclicStructure
"""Function_1: for-in循环用for循环实现1~100之间的奇数求和 Time: 2020.1.27Author: YaoXie"" ...
- Java连载86-List集合详解
一.List集合 1.List集合存储元素的特点: (1)有序(List集合中存储有下标):存进去是这样的顺序,取出来还是按照这个顺序取出. (2)可重复 2.深入ListJ集合 ArrayLis ...
- 网络共享服务(三)之SAMBA
前面说到了FTP和NFS,由于FTP是客户端和服务器基于ftp应用协议进行交换数据的,它不支持挂载共享目录的方式,而NFS又不支持跨平台,所以就催生了第三种网络共享服务:samba Samba是在Li ...
- 使用FDATOOL生成xilinx中FIR滤波器IP核的系数
1.在MATLAB命令窗口输入fdatool后回车,打开“Filter Designer & Analysis Tool”工具界面: 2.点击左下角的Set quantization para ...
- selenium--find_element_by_xpath()方法汇总
一.从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于css_selector中的>号/html/body/div/p 二.根据元素属性选择: 查找具体 ...