分析

这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性。

t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d)和p连边,按t从小到大

枚举点增广就好了。无解的情况只有一种,某个人无论如何都无法出去。

/*********************************************************
* --Sakura hirahira mai orite ochite-- *
* author AbyssalFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std; typedef long long ll; const int XY = , MAX_D = , MAX_P = ;//..MAX_T
char maz[XY][XY+]; const int maxv = MAX_D*MAX_P, maxe = maxv*MAX_P;
int hd[maxv],to[maxe],nx[maxe],ec;
#define eachEage int i = hd[u]; ~i; i = nx[i]
void add(int u,int v)
{
nx[ec] = hd[u];
to[ec] = v;
hd[u] = ec++;
} #define PB push_back
#define resv(x,n) x.reserve(n);
#define PS push
vector<int> pX, pY, dX, dY; const int dx[] = {,,-,}, dy[] = {,-,,}; int dist[XY][XY][XY][XY];
int X,Y; void bfs(int x,int y)
{
int (* const d)[XY] = dist[x][y];
memset(d,0xff,sizeof(dist[x][y])); queue<int> qx, qy;
d[x][y] = ;
qx.PS(x); qy.PS(y);
while(qx.size()){
x = qx.front(); qx.pop();
y = qy.front(); qy.pop();
for(int k = ; k--;){
int nx = x+dx[k], ny = y+dy[k];
if(<=nx && nx<X && <=ny && ny<Y && maz[nx][ny] == '.' && d[nx][ny]<){
d[nx][ny] = d[x][y]+;
qx.PS(nx); qy.PS(ny);
}
}
}
} int link[MAX_P];
int vis[maxv], clk; bool aug(int u)
{
vis[u] = clk;
for(eachEage){
int v = to[i], w = link[v];
if(w< || (vis[w] != clk && aug(w))){
link[v] = u;
return true;
}
}
return false;
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
resv(pX,MAX_P) resv(pX,MAX_P) resv(dX,MAX_D) resv(dY,MAX_D)
int T; cin>>T;
while(T--){
scanf("%d%d",&X,&Y);
pX.clear(); pY.clear();
dX.clear(); dY.clear();
for(int i = ; i < X; i++){
scanf("%s", maz[i]);
for(int j = ; j < Y; j++){
if(maz[i][j] == 'D'){
dX.PB(i); dY.PB(j);
}
else if(maz[i][j] == '.'){
pX.PB(i); pY.PB(j);
}
}
}
int d = dX.size(), p = pX.size();
if(p == ){ puts(""); continue; }
for(int i = ; i < d; i++){
bfs(dX[i],dY[i]);
}
int n = (X-)*(Y-);
bool fail = false;
memset(hd,0xff,sizeof(int)*n*d); ec = ;
for(int i = ; i < p; i++){
bool escape = false;
for(int j = ; j < d; j++){
if(dist[dX[j]][dY[j]][pX[i]][pY[i]] > ){
if(!escape) escape = true;
for(int k = dist[dX[j]][dY[j]][pX[i]][pY[i]]-; k < n; k++){
add(k*d+j, i);
}
}
}
if(!escape){
fail = true; break;
}
}
if(fail){ puts("impossible"); continue; }
memset(link,-,sizeof(int)*p);
int cnt = , ans;
for(int i = ; i < n*d; i++){
clk++;
if(aug(i) && ++cnt == p) {
ans = i/d+;
}
}
printf("%d\n", ans);
}
return ;
}

POJ 3057 Evacuation(二分匹配)的更多相关文章

  1. POJ 3057 Evacuation (二分匹配)

    题意:给定一个图,然后有几个门,每个人要出去,但是每个门每个秒只能出去一个,然后问你最少时间才能全部出去. 析:初一看,应该是像搜索,但是怎么保证每个人出去的时候都不冲突呢,毕竟每个门每次只能出一个人 ...

  2. TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs

    题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...

  3. POJ 3057 Evacuation 二分+最大流

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

  4. POJ 3057 Evacuation 二分图匹配

    每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...

  5. POJ 3057 Evacuation 题解

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

  6. POJ 3041 - 最大二分匹配

    这道题实现起来还是比较简单的,但是理解起来可能有点困难. 我最开始想到的是贪心法,每次消灭当前小行星最多的一行或一列.然而WA了.Discuss区里已经有高人给出反例. 下面给出正确的解法 我们把行和 ...

  7. POJ 3057 Evacuation(二分图匹配+BFS)

    [题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...

  8. 【最大匹配+二分答案】POJ 3057 Evacuation

    题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...

  9. poj 2446 Chessboard (二分匹配)

    Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12800   Accepted: 4000 Descr ...

随机推荐

  1. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  2. 外键约束 foreign key

    外键约束 :保持数据一致性,完整性实现一对多关系.外键必须关联到键上面去,一般情况是,关联到另一张表的主键 (因为一个表只存一类信息.用外键来做参照,保证数据的一致性,可以减少数据冗余) ##表acr ...

  3. P2746 [USACO5.3]校园网Network of Schools

    传送门 把所有学校的关系构成一个图,显然一个强联通分量的所有学校只要有一个有新软件,其他学校也都会有 考虑缩点,发现入度为 0 的块一定要给,因为没有其他人给它 入度不为 0 的块一定有其他人给,我们 ...

  4. myeclipse 上安装 Maven

    myeclipse 上安装 Maven3   环境准备: JDK 1.6 Maven 3.0.4 myeclipse 8.6.1 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Mav ...

  5. 关于String的split方法

    在做剑指offer的时候,有一道替换空格的题,立刻就想到用这个split方法来做,但发现,这个方法会丢掉字符串最后的空格??? 百度后,知道原因,这里直接复制粘贴了: 在使用java中的split按照 ...

  6. Java面向对象_对象数组

    今天学习了对象数组,写点东西总结一下.废话不多说,啥是对象数组呢? 对象数组的概念是这么讲的,对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组. 举个例子,使用对象数 ...

  7. 美国一家科技公司毕威拓(Pivotal)规定员工在早上9点06分准时上班,以提高工作效率。

    美国一家科技公司毕威拓(Pivotal)规定员工在早上9点06分准时上班,以提高工作效率. 据<英国广播公司BBC>报道,美国科技公司毕威拓(Pivotal)的员工每天都要在9点06分准时 ...

  8. 合理设置apache httpd的最大连接数--linux

    手头有一个网站在线人数增多,访问时很慢.初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能 ...

  9. easyUI 鼠标悬停某行提示

      最近参与公司的电子档案系统的开发,需求是需要用户鼠标悬停某一行时,需要根据后台业务数据进行提示. 档案系统开发采用的框架是struts2+mybatis+spring+easyUI开发,而前端的e ...

  10. FormsAuthentication IsAuthenticated一直为false

    解决办法: 在Web.Config中添加一下红框的内容