BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)
Description
Input
Output
Sample Input
XXXXX
X...D
XX.XX
X..XX
XXDXX
Sample Output
Solution
$Update$:写假了,先别看了QwQ
答案肯定是满足单调性的,所以我们可以枚举
(可以和跳舞那个题一样二分,不过二分就要每次重新添加边,太麻烦)
先判断impossible,BFS判断就行。
建图:超级源点-人-门-超级汇点
枚举秒数,每一秒就在门和超级汇点间连一条容量1的边,意味着当前秒这个门可以多出一个人了
若某个人到某个门耗费的时间为当前秒数,就在人和门间连一条容量为1的边
之后跑一边最大流,若最大流为人数的话就说明人可以全跑出去了
PS每次跑最大流的时候之前的Ans不能清零emmm
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define MAXM (100000+10)
#define MAXN (1010+10)
using namespace std;
struct node
{
int Flow;
int next;
int to;
}edge[MAXM*];
int Depth[MAXN],Q[MAXN];
int head[MAXN],num_edge;
int n,m,s,e=,d,INF;
int a[MAXN][MAXN];
int num[MAXN][MAXN];
int dis[MAXN][MAXN];
int PEOPLE[MAXN],P_sum;
int DOOR[MAXN],D_sum;
int dx[]={,,-,,},dy[]={,,,,-};
int q[][];
int Ans;
bool used[][];
char ch[]; void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].Flow=l;
edge[num_edge].next=head[u];
head[u]=num_edge;
} bool Bfs(int s,int e)
{
int Head=,Tail=;
memset(Depth,,sizeof(Depth));
Depth[s]=;
Q[]=s;
while (Head<Tail)
{
int x=Q[++Head];
for (int i=head[x];i!=;i=edge[i].next)
if (!Depth[edge[i].to] && edge[i].Flow>)
{
Depth[edge[i].to]=Depth[x]+;
Q[++Tail]=edge[i].to;
}
}
if (Depth[e]>) return true;
return false;
} int Dfs(int x,int low)
{
int Min,f=;
if (x==e || low==)
return low;
for (int i=head[x];i!=;i=edge[i].next)
if (edge[i].Flow> && Depth[edge[i].to]==Depth[x]+ && (Min=Dfs(edge[i].to , min(low,edge[i].Flow) )))
{
edge[i].Flow-=Min;
edge[((i-)^)+].Flow+=Min;
f+=Min;
low-=Min;
}
return f;
} int Dinic(int s,int e)
{
// int Ans=0;
while (Bfs(s,e))
Ans+=Dfs(s,0x7fffffff);
return Ans;
} void DISTANCE(int x,int y)
{
int Head=,Tail=;
memset(used,false,sizeof(used));
q[][]=x;
q[][]=y;
used[x][y]=true;
while (Head<Tail)
{
++Head;
for (int i=;i<=;++i)
{
int xx=q[Head][]+dx[i];
int yy=q[Head][]+dy[i];
if (!used[xx][yy] && a[xx][yy])
{
used[xx][yy]=true;
dis[num[x][y]][num[xx][yy]]=dis[num[x][y]][num[q[Head][]][q[Head][]]]+;
q[++Tail][]=xx;
q[Tail][]=yy;
}
}
}
} int main()
{
memset(&INF,0x7f,sizeof(INF));
int n,m,cnt=;
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
{
scanf("%s",ch);
for (int j=;j<=m;++j)
{
if (ch[j-]=='X')
continue;
num[i][j]=++cnt;
if (ch[j-]=='.')
{
a[i][j]=;
PEOPLE[++P_sum]=num[i][j];
}
else
{
a[i][j]=;
DOOR[++D_sum]=num[i][j];
}
}
}
for (int i=;i<=n;++i)
for (int j=;j<=m;++j)
if (a[i][j])
DISTANCE(i,j);
for (int i=;i<=P_sum;++i)
{
bool flag=false;
for (int j=;j<=D_sum;++j)
if (dis[PEOPLE[i]][DOOR[j]]!=)
{
flag=true;
break;
}
if (!flag)
{
printf("impossible\n");
return ;
}
}
for (int i=;i<=P_sum;++i)
{
add(,PEOPLE[i],);
add(PEOPLE[i],,);
}
for (int i=;i<=;++i)
{
for (int j=;j<=D_sum;++j)
{
add(DOOR[j],,);
add(,DOOR[j],);
}
for (int j=;j<=P_sum;++j)
for (int k=;k<=D_sum;++k)
if (dis[PEOPLE[j]][DOOR[k]]==i)
{
add(PEOPLE[j],DOOR[k],);
add(DOOR[k],PEOPLE[j],);
}
if (Dinic(,)==P_sum)
{
printf("%d",i);
return ;
}
}
}
BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)的更多相关文章
- BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 412[Submi ...
- Bzoj1189 [HNOI2007]紧急疏散evacuate
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 715 Descr ...
- bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...
- 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate
[法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...
- BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】
题目 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从 ...
- P3191 [HNOI2007]紧急疏散EVACUATE(费用流)
P3191 [HNOI2007]紧急疏散EVACUATE 费用流+卡常优化 我们只关心一个人通过门时的时间,在空地的行走时间可以分层维护 于是根据时间分层,到门的时候再计算代价,即代价$=$层数 每经 ...
- 【BZOJ1189】[HNOI2007]紧急疏散evacuate 动态加边网络流
[BZOJ1189][HNOI2007]紧急疏散evacuate Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空 ...
- 【二分答案】【最大流】[HNOI2007]紧急疏散EVACUATE
[HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...
随机推荐
- lombok入门
pom.xml加入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lo ...
- SpringBoot(八) Caching (更新中...)
缓存配置 在springboot的主类添加注解@EnableCaching启用缓存支持 参考文档 33. Caching spring framework >>> 8. Cache ...
- Springboot集成SpringData JPA
序 StringData JPA 是微服务框架下一款ORM框架,在微服务体系架构下,数据持久化框架,主要为SpringData JPA及Mybatis两种,这两者的具体比较,本文不做阐述,本文只简单阐 ...
- mac 下mongodb connect failed 连接错误
我是用brew install mongod 安装的 MongoDB shell version v3.4.2connecting to: mongodb://127.0.0.1:270172017- ...
- android调试debug快捷键
1. [Ctrl+Shift+B]:在当前行设置断点或取消设置的断点. 2. [F11]:调试最后一次执行的程序. 3. [Ctrl+F11]:运行最后一次执行的程序. 4. ...
- 微格式(microformat)
由于HTML中缺少相应的元素,很难突出显示人.地点或日期等类型的信息.为了解决这个问题,有一组开发人员决定开发一套标准的命名约定盒标记模式来表示这些数据.这些命名约定基于vCard和iCalendar ...
- 纯小白入手 vue3.0 CLI - 1 - npm 安装与初始化
node 开发环境请先自行准备 npm install -g @vue/cli 安装完成之后命令行则存在 vue 命令 vue -V 查看本地 vue 版本 vue -h 输出帮助 vue creat ...
- IOT安全
相关资源 IOT 漏洞 top 10 https://xz.aliyun.com/t/2278 https://www.owasp.org/images/8/8e/Infographic-v1.jpg ...
- 润乾V4报表放入WEBINF保护目录下如何实现
润乾报表放入WEBINF保护目录下如何实现 WEB-INF下面的文件都是受保护的,客户为了保护项目的文件不受到非法的访问,jsp页面都放在WEB-INF下,那润乾报表放入WEB-INF保护目录下 ...
- Linux安装Tomcat服务器发布项目教程
前面小Alan跟大家聊了在Linux服务器上jdk运行环境的安装以及redis非关系型数据库的安装,今天继续跟大家聊聊Tomcat的安装,以及将我们的项目发布上去并成功的访问. 第一步:将tomcat ...