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. java 泛型简单使用

  2. [C#] 如何截取完整的网页图片

    前言 有时候浏览到非常有用的网页时,我们会选择将它加入到收藏夹中,但是网站一旦过期,以后就看不到这个网页了.当然也可以将网页打印成PDF文档保存.最新的Windows 10中的Edge浏览器支持将网页 ...

  3. HTTP请求范例

    package com.grefr.basemethod; /*JAVA发送HTTP请求,返回HTTP响应内容,实例及应用 博客分类: JAVA实现 Java.netBeanJDKApache . J ...

  4. C#后台调用浏览器打开下载连接地址的三种方法

    一.从注册表中读取到本地计算机默认浏览器,然后调用下载. private void button1_Click(object sender, EventArgs e)   {       //从注册表 ...

  5. 为何webpack打包后的文件要放在服务器上才能运行

    为何会有此问: 在刚开始使用vue-cli时还不知道打包后的文件要在服务中才能运行,直接点开后发现页面白板,请教大神后得知要起一个服务才能运行起来,当时我脑子中的逻辑是这样的: 因为:js代码是由浏览 ...

  6. AmpLab Tachyon and Shark update

    一个开源的文件系统,拿来主义,先收藏,用得到细品. 简介:https://www.youtube.com/watch?v=cAZ624-69PQ 官网:http://tachyon-project.o ...

  7. 【集美大学1411_助教博客】个人作业2——英语学习APP案例分析 成绩

    个人作业2--英语学习APP案例分析,截止发稿时间全班31人,提交31,未提交0人.有一名同学已经写了作业但忘记提交了,这次给分了,但下不为例.由于助教这周有点忙,所以点评得非常不及时,请同学们见谅. ...

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

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 答:主要以泛型为主 //简单的泛型类的定义,T为类型参数 public ...

  9. 201521123014 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 Q1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通 ...

  10. 201521123020 《Java程序设计》第4周学习总结

    本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. (1)类注释的使用方法是: /** *(要注释的内容) */ (2)学习了Object类,学会了覆 ...