http://poj.org/problem?id=3057

题目大意:

.为人,D为门,X为障碍,门每秒只能出去一个人,问多少秒出光。

如果无法出光输出impossible。

————————————————

首先bfs处理出来每个人到每个门的最短距离。

然后枚举时间,将时间与门作为二元组(或者理解为是make_pair也行)

当(当前时间)>=(该人到该门的时间),就把(这个人)与(这个门和当前时间的二元组)连起来。

然后二分图匹配找到匹配数比较和人数相不相等即可。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int NUM1=;
const int NUM2=;
const int TP=NUM2*;
const int SUM=NUM1*TP;
const int INF=;
int dx[]={,-,,};
int dy[]={,,-,};
int cnt=;
int p[NUM1][TP];
struct pair{
int fi;
int se;
}turn[SUM];
int pii(int a,int b){
if(p[a][b])return p[a][b];
cnt++;
turn[cnt].fi=a;
turn[cnt].se=b;
return p[a][b]=cnt;
}
int mp[][],dis[][],pos[][];
int to[NUM1][NUM2];
bool BFS(int xx,int yy,int r,int c){
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
dis[i][j]=INF;
}
}
queue<int>q1,q2;
q1.push(xx);q2.push(yy);
dis[xx][yy]=;
bool ok=;
while(!q1.empty()){
int x=q1.front(),y=q2.front();
q1.pop();q2.pop();
if(mp[x][y]>){
to[pos[xx][yy]][mp[x][y]]=dis[x][y];
ok=;
continue;
}
for(int i=;i<;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>r||ny>c||nx<||ny<||mp[nx][ny]==-)continue;
if(dis[nx][ny]>dis[x][y]+){
dis[nx][ny]=dis[x][y]+;
q1.push(nx);q2.push(ny);
}
}
}
return ok;
}
bool vis[TP],a[NUM1][TP];
int shu[TP];
bool dfs(int i){
for(int j=;j<=cnt;j++){
if(a[i][j]&&!vis[j]){
vis[j]=;
if(!shu[j]||dfs(shu[j])){
shu[j]=i;
return ;
}
}
}
return ;
}
int num1,num2;
bool pan(int t){
memset(shu,,sizeof(shu));
int ans=;
for(int i=;i<=num1;i++){
memset(vis,,sizeof(vis));
if(dfs(i))ans++;
}
if(ans!=num1)return ;
return ;
}
void restart(){
cnt=;
num1=;
num2=;
memset(a,,sizeof(a));
memset(p,,sizeof(p));
memset(to,,sizeof(to));
memset(mp,,sizeof(mp));
memset(pos,,sizeof(pos));
return;
}
int main(){
int N;
cin>>N;
while(N--){
restart();
int r,c;
cin>>r>>c;
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
char ch;cin>>ch;
if(ch=='X')mp[i][j]=-;
else if(ch=='.'){
num1++;
pos[i][j]=num1;
}else mp[i][j]=;
}
}
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
if(mp[i][j]==){
num2++;
mp[i][j]=num2;
}
}
}
bool ha=;
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
if(!mp[i][j]){
if(!BFS(i,j,r,c)){
cout<<"impossible"<<endl;
ha=;
break;
}
}
}
if(ha)break;
}
if(ha)continue;
for(int i=;;i++){
for(int j=;j<=num1;j++){
for(int k=;k<=num2;k++){
if(to[j][k]&&to[j][k]<=i){
a[j][pii(k,i)]=;
}
}
}
if(pan(i)){
cout<<i<<endl;
break;
}
}
}
return ;
}

POJ3057:Evacuation——题解的更多相关文章

  1. POJ3057 Evacuation 二分图匹配+最短路

    POJ3057 Evacuation 二分图匹配+最短路 题目描述 Fires can be disastrous, especially when a fire breaks out in a ro ...

  2. POJ 3057 Evacuation 题解

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

  3. Emergency Evacuation 题解

    The Japanese government plans to increase the number of inbound tourists to forty million in the yea ...

  4. POJ3057 Evacuation(二分图最大匹配)

    人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...

  5. Evacuation,题解

    题目: 题意: 有人,门(只有边上有,且1s只能出去一个人),和墙,每s人可移动一个格子,问多少秒所有人可以逃出,逃不出输出“impossible” 分析: 首先,我们先想着样一个问题,如果这个人在某 ...

  6. Emergency Evacuation,题解

    题目: 题意: 在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例). 分析: 首先,我们先考虑简单的,只考虑出口前有什么事件发生:1. ...

  7. Codeforces Gym 100002 E "Evacuation Plan" 费用流

    "Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

  8. POJ 3057 Evacuation 二分+最大流

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

  9. POJ2175:Evacuation Plan(消负圈)

    Evacuation Plan Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 5665Accepted: 1481Special J ...

随机推荐

  1. Appium(Python)驱动手机淘宝App

    请注意操作步骤: 1. 用数据线连接手机, 打开开发者模式, 并赋予相关权限, 并保持不锁屏状态: 2. 启动Appium桌面服务端: 3. 运行程序: 首次运行, Appium会在手机上安装3个Ap ...

  2. 使用Iview Menu 导航菜单(非 template/render 模式)

    1.首先直接参照官网Demo例子,将代码拷贝进项目中运行, 直接报错: Cannot read property 'mode' of undefined. 然后查看官网介绍,有一行注意文字,好吧. 2 ...

  3. 悲剧文本(Broken Keyboard (a.k.a. Beiju Text),UVA 11988)

    题目描述: 题目思路: 1.使用链表来重新定位各个字符 2.用数组实现链表 3.开一个数组list[i]来存储字符数组下一个字符的位置 #include <iostream> #inclu ...

  4. 线性代数之——对角化和 A 的幂

    利用特征向量的属性,矩阵 \(A\) 可以变成一个对角化矩阵 \(\Lambda\). 1. 对角化 假设一个 \(n×n\) 的矩阵 \(A\) 有 \(n\) 个线性不相关的特征向量 \(x_1, ...

  5. 火狐metamask账号

    火狐metamask lock trophy pyramid sunny aim inmate body sense sing castle cinnamon cram

  6. 【转载】inotify+rsync实时同步 解决同步慢问题 (转载备记)

    原文地址:http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景 我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题. ...

  7. Python3 循环表达式

    一 While循环 基本循环 while 条件: 执行内容 #循环体 ... #循环体 ... #循环体 # 若条件为真,执行循环体内容 # 若条件为假,不执行循环体内容 实例1(Python 3.0 ...

  8. POJ 3028 Shoot-out(概率DP)

    Description This is back in the Wild West where everybody is fighting everybody. In particular, ther ...

  9. ACM 第十三天

    训练赛题目 题目地址:https://odzkskevi.qnssl.com/415c275cb0a15fcb4ede21b8cb5297de?v=1533963116   A题代码: #includ ...

  10. (三)java字符串

    不可变字符串 Java没有字符串类型,而是提供了一个预定义类String. java中的字符串是不可变字符串,因此无法更改某一个字符串变量的内容. 优点:编译器可以让字符串共享.当复制一个字符串时,原 ...