我们可以得到一个结论:没有两个机器人走过的路会重叠

所以题目就转变为了能不能让机器人的路径不重叠且每个机器人能到达终点

直接一个点朝他四连通方向的四个点连容量为1的边即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef int JQK;
int n, m;
char ch[][];
const int dir[][] = {{, }, {, }, {, -}, { -, }};
namespace dinic {
const int MAXN = ;
const int MAXM = ;
const int INF = ;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], ed = ;
int S, T, MAXP;
JQK f[MAXM << ];
inline void addedge(int u, int v, JQK cap) {
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
f[ed] = cap;
to[++ed] = u;
nxt[ed] = Head[v];
Head[v] = ed;
f[ed] = ;
return;
}
inline bool BFS() {
int u;
for (int i = ; i <= MAXP + ; i++) {
lev[i] = -;
}
//memset(lev, -1, sizeof(lev));
queue<int>q;
lev[S] = ;
q.push(S);
while (q.size()) {
u = q.front();
q.pop();
for (int i = Head[u]; i; i = nxt[i])
if (f[i] && lev[to[i]] == -) {
lev[to[i]] = lev[u] + ;
q.push(to[i]);
/*
if (to[i] == T)
{
return 1;
}
magic one way optimize
*/
}
}
for (int i = ; i <= MAXP + ; i++) {
cur[i] = Head[i];
}
//memcpy(cur, Head, sizeof Head);
return lev[T] != -;
}
JQK DFS(int u, JQK maxf) {
if (u == T || !maxf) {
return maxf;
}
JQK cnt = , tem;
for (int &i = cur[u]; i; i = nxt[i])
if (f[i] && lev[to[i]] == lev[u] + ) {
tem = DFS(to[i], min(maxf, f[i]));
maxf -= tem;
f[i] -= tem;
f[i ^ ] += tem;
cnt += tem;
if (!maxf) {
break;
}
}
if (!cnt) {
lev[u] = -;
}
return cnt;
}
JQK Dinic() {
JQK ans = ;
while (BFS()) {
ans += DFS(S, INF);
}
return ans;
}
void init(int SS, int TT) {
for (int i = ; i <= MAXP + ; i++) {
Head[i] = ;
}
ed = ;
S = SS;
T = TT;
return;
}
void work(int aim) {
int u, v, c;
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
if (ch[i][j] == '') {
continue;
}
for (int k = ; k < ; k++) {
int dx = i + dir[k][];
int dy = j + dir[k][];
if (dx >= && dx <= n && dy >= && dy <= m) {
if (ch[dx][dy] == '') {
continue;
}
addedge((i - )*m + j, (dx - )*m + dy, );
}
}
}
}
int ans = Dinic();
printf(ans == aim ? "Yes\n" : "No\n");
}
}
int main() {
int TNT, a, b, x, s, t;
scanf("%d", &TNT);
while (TNT--) {
scanf("%d %d", &n, &m);
scanf("%d %d", &a, &b);
dinic::MAXP = n * m + ;
s = n * m + ;
t = s + ;
dinic::init(s, t);
for (int i = ; i <= n; i++) {
scanf("%s", ch[i] + );
}
for (int i = ; i <= a; i++) {
scanf("%d", &x);
dinic::addedge(s, x, );
}
for (int i = ; i <= b; i++) {
scanf("%d", &x);
dinic::addedge(x + (n - )*m, t, );
}
if (a > b) {
printf("No\n");
continue;
}
dinic::work(a);
}
return ;
}

最新文章

  1. Consul的一个更新:服务端节点故障后重连
  2. easyui tree loadFilter的使用
  3. (SenchaTouch+PhoneGap)开发笔记(2)开发环境搭建二
  4. Sublime Text 3 使用
  5. UE4.7的IOS发布和调试的相关问题
  6. PHP不仅仅是PHP
  7. JVM垃圾回收机制总结(6) :透视Java的GC特性
  8. USACO Section 3.1: Score Inflation
  9. hdu 5055 Bob and math problem
  10. cocos2d-x精灵移动的方法
  11. Web应用部署工具
  12. [Redux] Generating Containers with connect() from React Redux (FooterLink)
  13. UC编程:环境变量的查询与修改
  14. DB2的基础指令 学习笔记
  15. Code Review 程序员的寄望与哀伤【转载】
  16. Docker问题: Layer already being pulled by another client. Waiting.什么原因
  17. linux_操作系统
  18. 演练Ext JS 4.2自定义主题
  19. odoo11 访问web/database/manager管理数据库页面布局混乱问题
  20. 通过springboot 去创建和提交一个表单(七)

热门文章

  1. FromServices回来
  2. hfile.block.cache.size - hbase调优
  3. python学习-21 集合 2
  4. 笔记-9:使用random库生成随机数
  5. 《统计学习方法》极简笔记P4:朴素贝叶斯公式推导
  6. 1266: gcd和lcm(Java)
  7. 1223: 输出汉诺塔问题的盘子移动步骤(Java)
  8. CMake入门-03-还是HelloWorld
  9. (三)使用Intent在活动中穿梭:显式和隐式Intent
  10. 安装Docker step by step