POJ3057:Evacuation——题解
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——题解的更多相关文章
- POJ3057 Evacuation 二分图匹配+最短路
POJ3057 Evacuation 二分图匹配+最短路 题目描述 Fires can be disastrous, especially when a fire breaks out in a ro ...
- POJ 3057 Evacuation 题解
题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...
- Emergency Evacuation 题解
The Japanese government plans to increase the number of inbound tourists to forty million in the yea ...
- POJ3057 Evacuation(二分图最大匹配)
人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...
- Evacuation,题解
题目: 题意: 有人,门(只有边上有,且1s只能出去一个人),和墙,每s人可移动一个格子,问多少秒所有人可以逃出,逃不出输出“impossible” 分析: 首先,我们先想着样一个问题,如果这个人在某 ...
- Emergency Evacuation,题解
题目: 题意: 在某一秒,每个人可以进行一个移动:去旁边座位,去过道,在过道向出口走,求最少多少秒可以让所有人离开(具体如图和样例). 分析: 首先,我们先考虑简单的,只考虑出口前有什么事件发生:1. ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- POJ 3057 Evacuation 二分+最大流
Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...
- POJ2175:Evacuation Plan(消负圈)
Evacuation Plan Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 5665Accepted: 1481Special J ...
随机推荐
- underscore.js 分析 第一天
Underscore 是一个非常实用的Javascript类库. 通过研究他能提高自身的JS水平. 我们看到整个代码被 (function() { /* 代码 */ }.call(this)); 包 ...
- 白话控制反转IoC及其应用
控制反转(IoC, Inversion of Control),依赖注入(DI, Dependency Injection)是在面向对象编程中经常碰到的专业术语.很多朋友可能在百度之后,便浅尝辄止,没 ...
- c的多态
使用函数数组,实现多态 参考my_strtoll10
- 微信小程序—day03
昨日问题 接着上一篇,昨天遇到的scroll-view组件不能滚动的问题. 今天经过调试,发现是由于:图片的实际宽高,大于给image设定的宽高导致的. 解决办法: 减小图片的实际宽高,使之小于ima ...
- mysql数据库基本操作命令
1.登录命令 mysql -u root -p "password" 2.列出所有数据库 show databases; 3.使用数据库 use db_name 4.列出数据库中所 ...
- iWebShop安装教程
要进行iWebShop测试,要先在本地电脑上安装iWebShop运行环境,之后再安装iWebShop程序,接下来我就一步步讲解,如何安装iWebShop程序. ##一.运行环境搭建 这里我推荐新手使用 ...
- Python学习笔记(一)一一一环境安装错误总结
第三方库安装 1 windows存在多个版本的python,pip安装Python库失败 解决方案:进入对应官网下载安装包,步骤:1 下载安装包到C:\Python36\Lib\site-pack ...
- 韦大仙--Katalon---一款好用的selenium自动化测试插件
selenium框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化脚本的效率.我们知道Selenium IDE是一款使用较多的 ...
- Objective-C 内存管理和ARC
内存管理 范围: 任何继承了NSObject的对象 对基本数据类型无效 原理: 每个对象内部都保存了一个与之相关联的整数 称为引用计数器 1.计数器的基本操作 当使用alloc new或者copy创建 ...
- 剑指offer-整数中1出现的次数27
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...