【题解】gym102361E Escape(分层图)

【题解】gym102361E Escape(分层图)

https://vjudge.net/problem/Gym-102361E

容易证明不会存在共用转换器的合法方案,因为出口互不相同且一旦共用转换器,要么以后走一样的路(这样就到最后两个机器人到了一个出口),要么有一个机器人的路径是非法的(同理)。

由此可以推断一段路径最多只会被一个机器人覆盖(路径相交不算)

这道题最主要是观察到这个性质。然后就可以做了。

建立两张网格图G1和G2,一张图只有上下的边,另一张图只有左右的边。两张图的对应格子连一条双向边。出入口在G1上处理一下即可。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;  typedef long long ll;
inline int qr(){
    int ret=0,f=0,c=getchar();
    while(!isdigit(c)) f|=c==45,c=getchar();
    while( isdigit(c)) ret=ret*10+c-48,c=getchar();
    return f?-ret:ret;
}
const int maxn=2e4+5;
int head[maxn],cur[maxn],d[maxn],cnt,S,T,id[105][105],n,m,a,b,pa[105],pb[105];
char c[105][105];
struct E{int to,nx,w;}e[maxn<<4];
void add(int fr,int to,int w,int init=0){
    static int cnt=1;
    if(init) return cnt=1,void();
    e[++cnt]=(E){to,head[fr],w}; head[fr]=cnt;
    e[++cnt]=(E){fr,head[to],0}; head[to]=cnt;
}
bool bfs(){
    memset(d,0,sizeof d);
    memcpy(cur,head,sizeof cur);
    static queue<int> q;
    d[S]=1; q.push(S);
    while(q.size()){
        int now=q.front();
        q.pop();
        for(int t=head[now];t;t=e[t].nx)
            if(e[t].w>0&&!d[e[t].to])
                q.push(e[t].to),d[e[t].to]=d[now]+1;
    }
    return d[T];
}
int dfs(int now,int fl){
    if(now==T||fl==0) return fl;
    int ret=0,p;
    for(int&t=cur[now];t;t=e[t].nx)
        if(d[e[t].to]==d[now]+1)
            p=dfs(e[t].to,min(e[t].w,fl)),fl-=p,ret+=p,e[t].w-=p,e[t^1].w+=p;
    return ret;
}
int Dinic(){
    int ret=0;
    while(bfs()) ret+=dfs(S,1e9);
    return ret;
}

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 main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    int TT=qr();
    while(TT--){
        n=qr(); m=qr(); a=qr(); b=qr();
        memset(head,0,sizeof head); add(1,1,1,1);
        for(int t=1;t<=n;++t) scanf("%s",c[t]+1);
        S=1; T=2;
        for(int t=1;t<=a;++t) pa[t]=qr();
        for(int t=1;t<=b;++t) pb[t]=qr();
        for(int t=1;t<=n-1;t++)
            for(int i=1;i<=m;i++)
                if(c[t][i]=='0' && c[t+1][i]=='0')
                    add(calcv(t,i),calcv(t+1,i),1),
                        add(calcv(t+1,i),calcv(t,i),1);
        for(int t=1;t<=n;t++)
            for(int i=1;i<=m-1;i++)
                if(c[t][i]=='0'&&c[t][i+1]=='0')
                    add(calch(t,i),calch(t,i+1),1),
                        add(calch(t,i+1),calch(t,i),1);
        for(int t=1;t<=n;t++)
            for(int i=1;i<=m;i++)
                if(c[t][i]=='0')
                    add(calch(t,i),calcv(t,i),1),
                        add(calcv(t,i),calch(t,i),1);
        for(int t=1;t<=a;t++) if(c[1][pa[t]]=='0') add(1,calcv(1,pa[t]),1);
        for(int t=1;t<=b;t++) if(c[n][pb[t]]=='0') add(calcv(n,pb[t]),2,1);
        int sav=Dinic();
        if(sav==a) puts("Yes");
        else puts("No");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/12272396.html

时间: 2024-11-10 16:01:46

【题解】gym102361E Escape(分层图)的相关文章

【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)

[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是$O(n^2)$的过不去 然而我们有一个优化的办法,可以建一个新图$G=(V,E)$其中$V$和原图$V$一一对应且连接一个$0$边,此外每个点向V中的$i+-d$连边. 类似网络流的办法瞎建就行了. 过不了uoj //@winlere #include<iostream> #include<cstdio> #include<cstring> #inc

【分层图】分层图学习笔记

zky学长不止一次说分层图很简单随便看看就会了 然后今天就拿出时间来学了学分层图(写这篇文章是不是会被骂傻叉算了反正我就是傻叉) 首先@出一篇论文 2004国家集训队<分层图思想及其在信息学竞赛中的应用>肖天 正文时间 ------------我是分割线>w<-------------- 裸的最短路和网络流题目大家都会,就算是需要把模型抽象分析一下才能得出也已经不算什么了 但是如果在最短路和网络流的基础上加入一些干扰操作呢? 比如我们可以进行一些操作让图中某些边的边权或者容量减半(

Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solved: 428[Submit][Status][Discuss] Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N;

Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1694  Solved: 635[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市

【BZOJ3627】【JLOI2014】路径规划 分层图

题意:自己看,这有传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3627 注意:点的等待时长示意图为: 很清晰了吧?没事,不清晰就不清晰吧,反正公式给你了,这不是本题知识点,扒就行了. 题解: 看到这题的数据范围,我们就想到了分层图,可是现在有两种需要分层的东西:剩余油量的限制,和经过红绿灯的限制.所以我们要搞掉其中一个,使题目转化成分层图.红绿灯限制很不好惹的样子,所以我们还是把剩余油量的限制搞掉吧. 怎么搞掉油量的限制呢?我们可以把整

[JLOI2011]飞行路线(分层图)

[JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在 n 个城市设有业务,设这些城市分别标记为 0 到 n?1 ,一共有 m 种航线,每种航线连接两个城市,并且航线有一定的价格. Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多 k 种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? 输入输出格式 输入格式: 数据的第一行有三个整数

「JLOI2011」「LuoguP4568」飞行路线(分层图最短路

题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在nn个城市设有业务,设这些城市分别标记为00到n-1n−1,一共有mm种航线,每种航线连接两个城市,并且航线有一定的价格. Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多kk种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? 输入输出格式 输入格式: 数据的第一行有三个整数,n,m,kn,m,k,分别表示城市

【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status][Discuss] Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站. 地图由点和双向边构成,每个点代表一个路口,也有可

poj3635Full Tank?[分层图最短路]

Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Description After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you v