原题

题目大意

墙壁“X”,空区域(都是人)“.”, 门“D”。

人向门移动通过时视为逃脱,门每秒能出去一个人,人可以上下左右移动,墙阻止移动。

求最优移动方案下,最后一个人逃脱的最短时间。如果有人无法安全逃脱(比如被墙围困住),则输出“impossible”。

解析

对于每个时间进行网络流(二分图匹配人和门)直到匹配到的人数等于总人数的时候输出,最大时间是n*m,大于即为impossible

#include<cstdio>
#include<queue>
#include<cstring>
#define pos(x,y) (x-1)*m+y
using namespace std;
int n,m,T,cnt,dx[]={0,1,0,-1,0},dy[]={0,0,1,0,-1},dis[50][150],lover[150],person,door,vis[15][15],p,QWQ;
bool v[150],mp[50][150],b;
char s[15][15];
queue <int> qx,qy,t; void init()
{
door=person=0;
cnt=0;
p=b=0;
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(lover,0,sizeof(lover));
} void bfs(int x,int y)
{
++door;
int rx,ry,tt;
qx.push(x);
qy.push(y);
t.push(0);
vis[x][y]=cnt;
while (!qx.empty())
{
rx=qx.front();ry=qy.front();tt=t.front();
qx.pop();qy.pop();t.pop();
for (int i=1;i<=4;i++)
{
if (s[rx+dx[i]][ry+dy[i]]=='.' && vis[rx+dx[i]][ry+dy[i]]!=cnt)
{
vis[rx+dx[i]][ry+dy[i]]=cnt;
qx.push(rx+dx[i]);qy.push(ry+dy[i]);t.push(tt+1);
dis[door][pos(rx+dx[i],ry+dy[i])]=tt+1;
}
}
}
} void getmap(int t)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=1;k<=door;k++)
if (dis[k][pos(i,j)] && dis[k][pos(i,j)]<=t && s[i][j]=='.')
mp[k][pos(i,j)]=1;
else mp[k][pos(i,j)]=0;
} bool find(int x)
{
for (int i=1;i<=n*m;i++)
{
if (!v[i] && mp[x][i])
{
v[i]=1;
if (!lover[i] || find(lover[i]))
{
lover[i]=x;
return 1;
}
}
}
return 0;
} int main()
{
scanf("%d",&QWQ);
while (QWQ--)
{
scanf("%d%d",&n,&m);
init();
for (int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (s[i][j]=='D') ++cnt,bfs(i,j);
else if (s[i][j]=='.') ++person;
for (int i=1;i<=n*m;i++)
{
getmap(i);
for (int j=1;j<=door;j++)
{
memset(v,0,sizeof(v));
if (find(j)) p++;
}
if (p==person)
{
printf("%d\n",i);
b=1;
break;
}
}
if (!b) printf("impossible\n");
}
return 0;
}

[poj] 3057 Evacuation的更多相关文章

  1. POJ 3057 Evacuation 二分+最大流

    Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...

  2. POJ 3057 Evacuation(二分图匹配+BFS)

    [题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...

  3. POJ 3057 Evacuation 题解

    题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...

  4. 【最大匹配+二分答案】POJ 3057 Evacuation

    题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...

  5. POJ 3057 Evacuation 二分图匹配

    每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...

  6. POJ 3057 Evacuation (二分匹配)

    题意:给定一个图,然后有几个门,每个人要出去,但是每个门每个秒只能出去一个,然后问你最少时间才能全部出去. 析:初一看,应该是像搜索,但是怎么保证每个人出去的时候都不冲突呢,毕竟每个门每次只能出一个人 ...

  7. POJ 3057 Evacuation(二分匹配)

    分析: 这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性. t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d ...

  8. TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs

    题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...

  9. POJ 3057 网络流 Evacuation

    题意: 有一个n×m的房间,四周每个格子要么是墙要么是门.中间部分是墙或者人. 现在所有人要从房间逃出去,每个人的速度为1,也就是每个单位时间只能向上下左右四个方向走一格. 多个人可以站在同一个格子上 ...

随机推荐

  1. 1060: [ZJOI2007]时态同步

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3610  Solved: 1521[Submit][Status][Discuss] Descript ...

  2. avalon ms-repeat avalon1

    工作原因要用到avalon二次开发, 但是看了下以前的avalon版本是1,现在大多数都是2版本了吧,,所以很多文档不好找,但是大多数还是好用的 ms-repeat 循环当前赋值的, ms-repea ...

  3. VM12虚拟机安装os x 10.11系统以及注意事项

    一.安装步骤 原文链接:https://blog.csdn.net/soachenshui/article/details/49251513 https://blog.csdn.net/soachen ...

  4. scrapy--BeautifulSoup

    BeautifulSoup官方文档:https://beautifulsoup.readthedocs.io/zh_CN/latest/#id8 太繁琐的,精简了一些自己用的到的. 1.index.h ...

  5. 在唯一密钥属性“fileExtension”设置为“.”时,无法添加类型为“mimeMap”的重复集合项

    在ASP.NET 网站的配置文件中添加了MIME类型,但是运行网站后在IIS上和页面上提示"在唯一密钥属性“fileExtension”设置为“.woff”时,无法添加类型为“mimeMap ...

  6. 如何导入CSV数据 (python3.6.6区别于python2 环境)

    1.python2环境下 2.python3.6.6环境下 如果用python2环境下的代码,在python3.6.6环境下编译会出现以下问题: 错误(1): SyntaxError:Missing ...

  7. 数据库DDL

    自己对数据库的整理,也是对自己知识的梳理 SQL ( Structure query language ) 结构化查询语言 SQL语言分为4个部分 1.DDL(Data Definition Lang ...

  8. Pythony的数据类型和变量使用方法详解

    数据类型:计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...

  9. 归并排序算法Java实现

    一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...

  10. [CodeForces954G]Castle Defense(二分答案+差分)

    Description 题目链接 Solution 二分答案,套一个差分标记即可 每次放弓箭手显然越右边越优 Code #include <cstdio> #include <alg ...