[poj] 3057 Evacuation
原题
题目大意
墙壁“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的更多相关文章
- POJ 3057 Evacuation 二分+最大流
Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...
- POJ 3057 Evacuation(二分图匹配+BFS)
[题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...
- POJ 3057 Evacuation 题解
题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...
- 【最大匹配+二分答案】POJ 3057 Evacuation
题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...
- POJ 3057 Evacuation 二分图匹配
每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...
- POJ 3057 Evacuation (二分匹配)
题意:给定一个图,然后有几个门,每个人要出去,但是每个门每个秒只能出去一个,然后问你最少时间才能全部出去. 析:初一看,应该是像搜索,但是怎么保证每个人出去的时候都不冲突呢,毕竟每个门每次只能出一个人 ...
- POJ 3057 Evacuation(二分匹配)
分析: 这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性. t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d ...
- TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs
题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...
- POJ 3057 网络流 Evacuation
题意: 有一个n×m的房间,四周每个格子要么是墙要么是门.中间部分是墙或者人. 现在所有人要从房间逃出去,每个人的速度为1,也就是每个单位时间只能向上下左右四个方向走一格. 多个人可以站在同一个格子上 ...
随机推荐
- 牛客小白月赛2 E 是是非非 【尼姆博弈】
链接:https://www.nowcoder.com/acm/contest/86/E来源:牛客网 题目描述 坎为水,险阳失道,渊深不测:离为火,依附团结,光明绚丽. 坎卦:水洊至,习坎:君子以常德 ...
- SAP BI 常用TCODE
S.No Tcode Description 1 RSA1 Administrator Work Bench 2 RSA11 Calling up AWB with the IC tree 3 RSA ...
- linux环境下nginx配置
1.反向代理配置 # nginx/conf/nginx.conf
- MySQL字段属性介绍
引言 这次Qi号分享MySQL字段属性简介.下面资料是Qi号搜集大量资料与个人理解的整理. MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如 ...
- php-5.6.26源代码 - opcode执行
文件 php-5.6.26/Zend/zend_vm_execute.h ZEND_API void execute_ex(zend_execute_data *execute_data TSRMLS ...
- mysql 安装常用命令,卸载不干净等
安装mysql apt-get install mysql-server apt-get install mysql-client sudo apt-get install libmysqlclien ...
- PTA 7-12(图) 社交网络图中结点的“重要性”计算 最短路
7-12(图) 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的 ...
- B-树 动机与结构
Ps.我们遵循从感性到理性的认知顺序来逐步探索B-树的奥秘,之前经常说的value这里用key(关键码)指代,因为可能存的是字符串,说是value就不合适了. (多图预警!!!建议在WI-FI下观看) ...
- Bootstrap3适配IE8浏览器的方法
<!--[if lte IE 8]> <script src="js/respond.min.js"></script> <script ...
- 笔记-python操作mysql
笔记-python操作mysql 1. 开始 1.1. 环境准备-mysql create database db_python; use db_python; create tabl ...