原题

题目大意

墙壁“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. Linux文件服务器实战(虚拟用户)

    vsftpd基于系统用户访问ftp服务器,系统用户越多越不利于管理,不利于系统安全,这样就以vsftp虚拟防护的方式来解决. 虚拟用户没有实际的真实系统用户,,而是通过映射到其中一个真实用户以及设置相 ...

  2. Linux文件系统与目录结构

    在Linux系统中,目录被组织成一个:单根倒置树结构,文件系统从根目录开始,用/来表示.文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以.开头的为隐藏文件,路径用/来进行分割(win ...

  3. Linux用户与组管理命令

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut -d" " -f1 | sort -u 或 who | cut -d ...

  4. System.gc()日志分析

    打开日志:运行配置---XX:+PrintGCDetails 示例程序: package com.test; public class Test { private Object instance = ...

  5. 转-Spark编程指南

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  6. tomcat 无论如何都无法创建新的Servers

    1.退出eclipse 2.到[工程目录下 workspace ]/.metadata/.plugins/org.eclipse.core.runtime 3.把org.eclipse.wst.ser ...

  7. PHP.29-TP框架商城应用实例-后台6-商品会员添加-价格、级别

    首先把需求分析搞清楚 主要实现两个功能 1.会员管理,设置成为会员的要求 2.添加商品时,可设置会员优惠价格 具体实现 1.建表[会员级别限定表p39_member_level{Id,级别名称,积分下 ...

  8. 解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0

    解决办法是你需要将工程根目录build.gradle中的 classpath 'com.android.tools.build:gradle:2.2.0' 更改成 classpath 'com.and ...

  9. libmt.so: undefined reference to `av_find_stream_info@LIBAVFORMAT_53'

    [root@localhost instance]# make gcc -O3 -g -I/usr/include/ -I/usr/include/glib- -fexceptions -fstack ...

  10. 用swoole实现nginx日志解析

    1.原技术路线解析 在nging配置中将日志信息交给syslog处理,rsyslog配置中将数据传递给了514端口解析,然后将解析好的数据传入elasticsearch中. nginx配置 serve ...