Prison Break

时间限制: 1 Sec  内存限制: 128 MB
提交: 105  解决: 16
[提交][状态][讨论版]

题目描述

Scofild又要策划一次越狱行动,和上次一样,他已经掌握了整个监狱的地图,看守的位置,以及准备好了逃出监狱的出口。由于消息被其他监狱中的囚犯得知了,为了不泄露消息,他不得不将所有人带出监狱。 
这是一个月黑风高的夜晚。。。看守们都已经睡着,在没有罪犯打扰的情况下绝对不会醒来,即罪犯不能到达看守所在位置。在每一个空地中,都有一名罪犯,并且同一个空地,能容纳无穷多个罪犯。每个人都只能向东南西北四个方向移动。在地图中某些位置,有一些出口,当罪犯到达出口,就视为逃出监狱,并且出口每一秒钟最多能逃出1个罪犯。现在越狱行动开始。。。Scofild需要安排一个越狱计划,使得大家能尽快的逃出监狱。此时,监狱的监控发现了情况,监狱外的警察,将在T秒后到达现场,并封锁所有出口。现在Scofild想要知道所有人能否成功越狱,如果能,计算出所需的最短的越狱时间,使得最后一个人逃出监狱的时间尽量的短。

输入

第一行三个整数r,c,T(3 <= r, c <= 12) 
接下来r行字符,每行c列。‘.’表示一个空地,一开始该点有一名罪犯。‘X’表示警察的位置,并且他不能移动,罪犯也不能到达该点,否则他就会醒来并拉响警报。‘E’表示出口。

输出

1行,输出最少的越狱时间,如果在大批警察赶到之后还有人无法逃离,则输出“impossible”。

样例输入

5 5 3
XXEXX
X...X
E...X
X...E
XXXXX

样例输出

3
这道题也许很少有人会去想二分答案,因为我看到这题的是时候没什么思路,模型转换最基础的都不会,直到zyh老师讲了一遍才知道,主要还是构图问题十分严重,
可以这样构图,求出各人犯到出口的最短路,然后就等在那里,假设有几个分身,因为出口一次只能跑出去一个人所以人到了可以等在那里,然后从那个时刻开始,
可以发现 n时刻可以全跑出,那么>n的时刻绝对可以跑出,如果n时刻不能跑出,那么n-1时刻坑定不能跑出,所以具有二分性,如何判断能不能跑完呢?就是用二分图
最大匹配数去判断,将每个出口裂成mid时刻个点,如果最短时间是t则与裂成的点,表示t,t+1,...,mid所有点连一条边,表示任何这里时刻都可以跑出,这样复杂度
O(nmlogt)是可以过的。
 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std; typedef pair<int,int>fzy;
const int NN=*+; int n,m,T,ckt=,ckq=;
int dis[NN][NN],flag[NN*],fa[NN*];
char c[][];
bool boo[][];
int cb[][]={};
struct node
{
int x,y,flag;
}out[NN],qf[NN];
int cnt,head[NN*],next[],rea[]; void add(int u,int v)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
}
bool dfs(int u)
{
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (flag[v]==)
{
flag[v]=;
if (fa[v]==-||dfs(fa[v]))
{
fa[v]=u;
return ;
}
}
}
return ;
}
void bfs(int i)
{
queue<fzy>q;
queue<int>p;
memset(boo,,sizeof(boo));
boo[qf[i].x][qf[i].y]=;
while (!q.empty()) q.pop();
while (!p.empty()) p.pop();
q.push(make_pair(qf[i].x,qf[i].y));
p.push();
while (!q.empty())
{
fzy now=q.front();
int vis=p.front();
q.pop(),p.pop();
int x=now.first,y=now.second;
if (c[x][y]=='E') dis[i][cb[x][y]]=vis;
if (x->=&&c[x-][y]!='X'&&boo[x-][y]==)
{
boo[x-][y]=;
q.push(make_pair(x-,y));
p.push(vis+);
}
if (x+<=n&&c[x+][y]!='X'&&boo[x+][y]==)
{
boo[x+][y]=;
q.push(make_pair(x+,y));
p.push(vis+);
}
if (y->=&&c[x][y-]!='X'&&boo[x][y-]==)
{
boo[x][y-]=;
q.push(make_pair(x,y-));
p.push(vis+); }
if (y+<=m&&c[x][y+]!='X'&&boo[x][y+]==)
{
boo[x][y+]=;
q.push(make_pair(x,y+));
p.push(vis+);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
memset(dis,-,sizeof(dis));
for (int i=;i<=n;i++)
scanf("%s",c[i]+);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (c[i][j]=='E')
{
out[++ckt].flag=ckt;
out[ckt].x=i,out[ckt].y=j;
cb[i][j]=ckt;
}
else if (c[i][j]=='.')
{
qf[++ckq].x=i;
qf[ckq].y=j;
}
for (int i=;i<=ckq;i++) bfs(i);
int l=,r=T+;
while (l<r)
{
int mid=(l+r)/;
cnt=;
memset(head,-,sizeof(head));
for (int i=;i<=ckq;i++)
for (int j=;j<=ckt;j++)
if (dis[i][j]!=-)
for (int k=dis[i][j];k<=mid;k++)
add(i,(j-)*mid+k);
int res=;
memset(fa,-,sizeof(fa));
for (int i=;i<=ckq;i++)
{
memset(flag,,sizeof(flag));
res+=dfs(i);
}
if (res==ckq) r=mid;
else l=mid+;
}
if (l==)
{
cout<<<<endl;
return ;
}
if (l==T+) printf("impossible");
else printf("%d\n",l);
}

Prison Break的更多相关文章

  1. HDU 3681 Prison Break(BFS+二分+状态压缩DP)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

  2. hdu 3681 Prison Break (TSP问题)

    Prison Break Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  3. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  4. hdu3511 Prison Break 圆的扫描线

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=3511 题目: Prison Break Time Limit: 10000/5000 MS ( ...

  5. HDU3681 Prison Break

    Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  6. 1254 - Prison Break

    1254 - Prison Break   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Mic ...

  7. HDU 3681 Prison Break(状态压缩dp + BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...

  8. hdu 3681 Prison Break

    http://acm.hdu.edu.cn/showproblem.php?pid=3681 题意:一个n*m的矩阵,'F'是起点.机器人从F出发,走到G可以充电,走到Y关掉开关,D不能走进,要求把所 ...

  9. light oj 1254 - Prison Break 最短路

    题目大意:n个点m条边的有向图,q次询问c,s,t,表示汽车邮箱容量为c,求从起点s到终点t的最小费用.汽车在每个点可以加任意的油,每个点的单位油价为a[i]. 题目思路:利用最小费优先队列优化最短路 ...

随机推荐

  1. 微信中通过页面(H5)直接打开本地app的解决方案

    简述 微信中通过页面直接打开app分为安卓版和IOS版,两个的实现方式是完全不同的. 安卓版实现:使用腾讯的应用宝,只要配置了“微下载”之后,打开链接腾讯会帮你判断本地是否已经安装了app,如果本地安 ...

  2. Linux平台 Oracle 12cR2 RAC安装Part3:DB安装

    Linux平台 Oracle 12cR2 RAC安装Part3:DB安装 四.DB(Database)安装 4.1 解压DB的安装包 4.2 DB软件安装 4.3 ASMCA创建磁盘组 4.4 DBC ...

  3. Swift4.0 Array详解

    数组的介绍 数组(Array)是一串有序的由相同类型元素构成的集合,数组中的集合元素是有序的,可以重复出现.在Swift中数组类型是Array,是一个泛型集合.数组分成:可变数组和不可变数组,分别使用 ...

  4. asp.net mvc 4 项目升级到 asp.net mvc5

    一.开始 1.打开或新建asp.net mvc 4项目 2.修改 global.asax文件 原: WebApiConfig.Register(GlobalConfiguration.Configur ...

  5. unix下的文件和目录详解以及操作方法

    前言:unix下一切东西都是文件,一共有7种不同的文件,前一篇博客已经讲解的很清楚了,不懂的可以看看这里.当然,博主知道有些朋友比忙,没时间看,那我就简单点讲讲这7中文件都有哪些吧. 文件类型包括在s ...

  6. 集美大学网络1413第十三次作业成绩(团队八) -- 第二次项目冲刺(Beta阶段)

    题目: 团队作业8--第二次项目冲刺(Beta阶段) 团队作业8-成绩:  团队/分值 新加入成员 角色 技术特点 改善的功能. 原因. bug 新增功能. 方法. 如何实现 团队分工改进. 原因 改 ...

  7. SNS团队Beta阶段第六次站立会议(2017.5.27)

    1.立会照片 2.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 发音图标的改进 对界面各部分的图标进行完善.美化 龚晓婷 对于历史记录功能的测试 对于历史记录功能进一步完善 林仕庄 ...

  8. 201521123107 《Java程序设计》第10周学习总结

    第10周作业-异常与多线程 1.本周学习总结 2.书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有try块中 ...

  9. 201521044091 《java程序设计》第八周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容.1.2 选做:收集你认为有用的代码片段 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1)1.1 实验 ...

  10. 小Writeup

    Misc 100 下载文件之后是一个zip压缩包.因为一开始没有给任何提示信息,题目也什么都没说,爆破了一会无果.同时不是伪加密,所以应该是明文攻击.之后官方给出提示,是一个网址. F12进入调试,发 ...