Evacuation,题解
题目:



题意:
有人,门(只有边上有,且1s只能出去一个人),和墙,每s人可移动一个格子,问多少秒所有人可以逃出,逃不出输出“impossible”
分析:
首先,我们先想着样一个问题,如果这个人在某一秒可以到达了这个们,他将可以在这1s之后的任一没人通过此门的时刻出门。而且题意说每个门每一刻只能使1人通过,那么我们可以直接把门分成好多门(1s一个,当然时间有上线),然后让人和这些门去匹配就好了,看一下第几秒可以人都匹配上就好了,当然我们加一个二分不要一个一个跑了,最后复杂度:10(二分)*10*10(人)*10*10(人)*44(门)*100(时间)(有些估算的较大),有点大,不过还是可以的,毕竟这样求匹配的常熟是很小的。当然有人写的是用D去匹配.然后不用二分了,但是这样的复杂度更大了,它是10*10(人)*44(门)*100(时间)*44(门)*100(时间),而且常数可能也大了。最后就是代码。
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
char ch[][];
const int maxn=***+;
struct E{
int to;
int next;
int val;
}ed[maxn];
int head[maxn],ma[maxn],tot;
bool vis[][];
void J(int a,int b,int c){
ed[++tot].to=b;
ed[tot].val=c;
ed[tot].next=head[a];
head[a]=tot;
}
struct Node{
int x,y,t;
Node(){}
Node(int a,int b,int c){x=a;y=b;t=c;}
};
int x,y;
queue<Node> qu;
int dx[]={,,,-};
int dy[]={,-,,};
int M1(int a,int b){return y*(a-)+b;}
int M2(int a,int b,int t){return (M1(a,b)-)*+t;}
void JIA(int a,int b,int nx,int ny,int t){
for(int i=t;i<=;i++)
J(M1(a,b),M2(nx,ny,i),i);
}
void Bfs(int a,int b){
memset(vis,,sizeof(vis));
vis[a][b]=;
qu.push(Node(a,b,));
while(!qu.empty()){
Node js=qu.front();
qu.pop();
for(int i=;i<;i++){
int nx=js.x+dx[i],ny=js.y+dy[i];
if(nx>=&&nx<=x&&ny>=&&ny<=y&&!vis[nx][ny]&&ch[nx][ny]=='.'){
vis[nx][ny]=;
qu.push(Node(nx,ny,js.t+));
}
if(nx>=&&nx<=x&&ny>=&&ny<=y&&!vis[nx][ny]&&ch[nx][ny]=='D'){
vis[nx][ny]=;
JIA(a,b,nx,ny,js.t+);
}
}
}
}
bool vis2[maxn];
bool Dfs(int x,int t){
for(int i=head[x];i;i=ed[i].next){
if(vis2[ed[i].to]||ed[i].val>t) continue;
vis2[ed[i].to]=;
if(ma[ed[i].to]==||Dfs(ma[ed[i].to],t)){ma[ed[i].to]=x;return ;}
}
return ;
}
bool pd(int t){
memset(ma,,sizeof(ma));
for(int i=;i<=x;i++)
for(int j=;j<=y;j++)
if(ch[i][j]=='.'){
memset(vis2,,sizeof(vis2));
if(!Dfs(M1(i,j),t)) return ;
}
return ;
}
int main(){
int t;
scanf("%d",&t);
for(int jsjs=;jsjs<=t;jsjs++){
scanf("%d%d",&x,&y);
memset(head,,sizeof(head));
tot=;
for(int i=;i<=x;i++) for(int j=;j<=y;j++) scanf(" %c",&ch[i][j]);
for(int i=;i<=x;i++) for(int j=;j<=y;j++) if(ch[i][j]=='.') Bfs(i,j);
int l=,r=;
while(l<=r){
int mid=(l+r)/;
if(pd(mid)) r=mid-;
else l=mid+;
}
if(l==) printf("impossible\n");
else printf("%d\n",l);
}
return ;
}
Evacuation,题解的更多相关文章
- POJ 3057 Evacuation 题解
题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...
- Emergency Evacuation 题解
The Japanese government plans to increase the number of inbound tourists to forty million in the yea ...
- POJ3057:Evacuation——题解
http://poj.org/problem?id=3057 题目大意: .为人,D为门,X为障碍,门每秒只能出去一个人,问多少秒出光. 如果无法出光输出impossible. ——————————— ...
- Emergency Evacuation,题解
题目: 题意: 在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例). 分析: 首先,我们先考虑简单的,只考虑出口前有什么事件发生:1. ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- POJ 3057 Evacuation 二分+最大流
Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...
- POJ2175:Evacuation Plan(消负圈)
Evacuation Plan Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 5665Accepted: 1481Special J ...
- ICPC — International Collegiate Programming Contest Asia Regional Contest, Yokohama, 2018–12–09 题解
目录 注意!!此题解存在大量假算法,请各位巨佬明辨! Problem A Digits Are Not Just Characters 题面 题意 思路 代码 Problem B Arithmetic ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- vue+jquery使用FormData向后端传递数据和文件,express如何获取
使用multiparty 模块 下载 cnpm install multiparty --save 前端代码: <template> <div class="add-are ...
- 几种常见的dfs模板
判断从v出发是否能走到终点 bool dfs(v){ if(v is 终点)return true; if(v is 旧点)return false; 将v标记为旧点: 对和v相邻的每个节点u{ if ...
- EasyARM-iMX257 linxu两年前的笔记
第三章续:简单总结第三章中出现的命令! 1) root@EasyARM-iMX257 ~# ddif=/dev/zero of=/dev/shm/disk bs=1024 count=10240 d ...
- Java对象实例化的过程
1.先为对象分配空间,并按属性类型默认初始化 ps:八种基本数据类型,按照默认方式初始化,其他数据类型默认为null 2.父类属性的初始化(包括代码块,和属性按照代码顺序进行初始化) 3.父类构造函数 ...
- OAuth + Security - 6 - 自定义授权模式
我们知道OAuth2的官方提供了四种令牌的获取,简化模式,授权码模式,密码模式,客户端模式.其中密码模式中仅仅支持我们通过用户名和密码的方式获取令牌,那么我们如何去实现一个我们自己的令牌获取的模式呢? ...
- Ubuntu18.04美化MacOS(新更grub界面美化)
写在前面的话: 在美化过程中大多数资源来自境外网站,下载时速度特别慢,写这篇博客一是为了给读者看,也是为了自己保存资源并记录ubuntu18.04的使用,避免你们或是自己以后再花费大量时间去百度方法和 ...
- (五)连接查询(SQL99标准)、子查询、分页查询、联合查询
一.连接查询(SQL99标准) 1.含义:当要查询的数据来自多张表时要使用连接查询 2.语法: select 查询列表 from 表1 别名 [连接类型] join 表2 别名 on 连接条件 [wh ...
- 快捷键浏览存储过程的内容(执行文中的User Store Proc,设置快捷方式的指向usp_Name)
虽然不常用,但使用时还是在用传统方法查看存储过程的内容, sp_helptext usp_Name;下面这段执行后可设置快捷查询usp的内容(但是需要在每个数据库下都存在,不能直接在master,并且 ...
- controller场景设计
场景设计模型-手动场景快增长慢增长指定运行次数组模式 快增长模型:就是压力瞬间启动并且达到最大,通常用于秒杀的场景 loadrunner设置:瞬间启动,瞬间停止 慢增长:压力按照设定的规则慢慢的添加, ...
- Arduino_DH11+0.96OLED_u8glib库 温湿度显示
u8glib_arduino_OLED0.96一.电路连接 DHT11接线方式:GND<————>GNDDATA<————>2(数字输入/输出)VCC<————>5 ...