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 ;
}

最新文章

  1. POJ2396 Budget
  2. Java 动态生成复杂 Word
  3. hmtl的标签属性
  4. Unity 摄像机Clear Flags和Culling Mask属性用途详解
  5. Fresco 源码分析(二) Fresco客户端与服务端交互(2) Fresco.initializeDrawee()分析 续
  6. 关于SQL语句优化的一个问题
  7. 5059 一起去打CS
  8. 2016多校第六场题解(hdu5793&amp;hdu5794&amp;hdu5795&amp;hdu5800&amp;hdu5802)
  9. DDMS中File Explorer无法查看data/data文件解决办法
  10. java学习之坦克大战游戏
  11. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
  12. PAT (Advanced Level) 1066. Root of AVL Tree (25)
  13. 关于for()循环使用过程中遇到的问题(俄罗斯方块游戏中遇到的问题)
  14. jquery.jqprint-0.3.js打印table表格遇到的坑
  15. Maven-FAQ
  16. 关于java中的值传递与引用传递遇到的问题
  17. Windows -- cmd命令: netstat 和 arp
  18. linux 下tftpf搭建
  19. MSF《构建之法》阅读笔记5
  20. cad2017卸载/安装失败/如何彻底卸载清除干净cad2017注册表和文件的方法

热门文章

  1. LVS Nginx HAProxy
  2. Qt-QML-Repeater-导航条
  3. python3读取csv文件
  4. 简单的switch嵌套
  5. git push origin master 错误解决办法
  6. 关于@media不生效的问题和meta总结
  7. tensorflow学习笔记(4)-学习率
  8. Alpha版——版本控制报告(Thunder)
  9. c++SDK c#调用_疑难杂症
  10. Internet Technologe