Description

发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域。每个格子如果是'.',那么表示这是一块空地;如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从这儿撤出房间。已知门一定在房间的边界上,并且边界上不会有空地。最初,每块空地上都有一个人,在疏散的时候,每一秒钟每个人都可以向上下左右四个方向移动一格,当然他也可以站着不动。疏散开始后,每块空地上就没有人数限制了(也就是说每块空地可以同时站无数个人)。但是,由于门很窄,每一秒钟只能有一个人移动到门的位置,一旦移动到门的位置,就表示他已经安全撤离了。现在的问题是:如果希望所有的人安全撤离,最短需要多少时间?或者告知根本不可能。

Input

输入文件第一行是由空格隔开的一对正整数N与M,3<=N <=20,3<=M<=20,以下N行M列描述一个N M的矩阵。其中的元素可为字符'.'、'X'和'D',且字符间无空格。

Output

只有一个整数K,表示让所有人安全撤离的最短时间,如果不可能撤离,那么输出'impossible'(不包括引号)。

Sample Input

5 5 
XXXXX
X...D
XX.XX
X..XX
XXDXX

Sample Output

3

HINT

2015.1.12新加数据一组,鸣谢1756500824

C++语言请用scanf("%s",s)读入!

【题目分析】

枚举每一个答案t,对于每一个格子,拆成t+1个点,分别代表每一时刻的这个点,然后建边,每次增大t的时候,再加入一层点,然后满流之后就可以得到答案了。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
//#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 1000005
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int n,m,S,T;
char s[21];
int a[21][21]; // 0 X 1 . 2 D
int hs[21][21][201];
int mov[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

int fr[maxn],h[maxn],to[maxn],fl[maxn],en=0,ne[maxn];

void add(int a,int b,int r)
{
    to[en]=b; fr[en]=a; fl[en]=r; ne[en]=h[a]; h[a]=en++;
    to[en]=a; fr[en]=b; fl[en]=0; ne[en]=h[b]; h[b]=en++;
}

int map[maxn];

bool tell()
{
    memset(map,-1,sizeof map);
    queue <int> q;
    while (!q.empty()) q.pop();
    q.push(S); map[S]=0;
    while (!q.empty())
    {
        int x=q.front(); q.pop();
        for (int i=h[x];i>=0;i=ne[i])
        {
            if (fl[i]>0&&map[to[i]]==-1)
            {
                map[to[i]]=map[x]+1;
                q.push(to[i]);
            }
        }
    }
    if (map[T]==-1) return false;
    return true;
}

int zeng(int k,int now)
{
    if (k==T) return now;
    int ret=0;
    for (int i=h[k];i>=0&&now>ret;i=ne[i])
    {
        if (fl[i]>0&&map[to[i]]==map[k]+1)
        {
            int tmp=zeng(to[i],min(fl[i],now-ret));
            ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
        }
    }
    if (!ret) map[k]=-1;
    return ret;
}

void init()
{memset(h,-1,sizeof h);en=0;}

int dinic()
{
    int r=0,t;
    while (tell()) while (t=zeng(S,inf)) r+=t;
    return r;
}

int sum=0,out=0;

int main()
{
    n=read(); m=read();
    for (int i=1;i<=n;++i)
    {
        scanf("%s",s+1);
        for (int j=1;j<=m;++j)
        {
            if (s[j]=='X') a[i][j]=0;
            else if (s[j]=='.') a[i][j]=1,sum++;
            else if (s[j]=='D') a[i][j]=2;
        }
    }
    init();S=0; T=maxn-1;
    int cnt=0;
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
            for (int k=0;k<=200;++k)
                hs[i][j][k]=++cnt;
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
            if (a[i][j]==1)
                add(S,hs[i][j][0],1);
    for (int t=0;t<130;++t)
    {
        for (int i=1;i<=n;++i)
            for (int j=1;j<=m;++j)
            {
                if (a[i][j]==1)
                {
                    add(hs[i][j][t],hs[i][j][t+1],inf);
                    for (int l=0;l<4;++l)
                    {
                        int tx=i+mov[l][0],ty=j+mov[l][1];
                        if (tx<1||tx>n||ty<1||ty>m||a[tx][ty]==0) continue;
                        add(hs[i][j][t],hs[tx][ty][t+1],inf);
                    }
                }
                else if (a[i][j]==2)
                {
                    add(hs[i][j][t],T,1);
                    add(hs[i][j][t],hs[i][j][t+1],inf);
                }
            }
        out+=dinic();
        if (out==sum)
        {
            printf("%d\n",t);
            return 0;
        }
    }
    printf("impossible\n");
}

  

 

BZOJ 1189 [HNOI2007]紧急疏散evacuate的更多相关文章

  1. BZOJ 1189: [HNOI2007]紧急疏散evacuate( BFS + 二分答案 + 匈牙利 )

    我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利 ...

  2. bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流

    [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3626  Solved: 1059[Submit][St ...

  3. bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...

  4. 【BZOJ】1189: [HNOI2007]紧急疏散evacuate(二分+bfs+网络流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1189 表示完全不会QAQ.... 于是膜拜题解orz 二分时间........... 于是转换成判定 ...

  5. 1189: [HNOI2007]紧急疏散evacuate - BZOJ

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...

  6. 1189: [HNOI2007]紧急疏散evacuate

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3831  Solved: 1119[Submit][Status][Discuss] Descript ...

  7. bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate

    http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...

  8. Bzoj1189 [HNOI2007]紧急疏散evacuate

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2293  Solved: 715 Descr ...

  9. BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 412[Submi ...

随机推荐

  1. LeetCode 202 Happy Number

    Problem: Write an algorithm to determine if a number is "happy". A happy number is a numbe ...

  2. php与xpath使用操作文本节点

    <?php $html="<p> 对于2014年,省统计局的统计分析显示,我省消费流通领域受诸多因素的影响,有机遇也有挑战.但值得注意的是,消费增长还存在不少制约因素,比如 ...

  3. JavaScript prototype应用

    //JavaScript自定义功能 //1,去除字符串两端空格 String.prototype.trim = function() { var start, end; start = 0; end  ...

  4. [Android Pro] Toolbar的完全自定义

    reference to : http://blog.csdn.net/elder_sword/article/details/46634751 Toolbar是什么,不知道的可以去大神的博客瞻仰下 ...

  5. endnote设置文献第二行悬挂缩进办法

    参考:http://blog.sina.com.cn/s/blog_62b13cf201014lfr.html  使用[endnote]插入文献后,如果文献稍长些,有第二行,第二行会顶格开始.并且这个 ...

  6. SQLServer基本操作

    SQL 全名是结构化查询语言(Structured Query Language),是关系数据库管理系统的标准语言 1.分离数据库:将当前数据库文件和数据库引擎的关系断开,没有任何关系了,这样就可以随 ...

  7. App Store审核被拒的23个理由

    原文地址 iOS 应用提交审核要持续一周或者更久,在提交之前,我们一定要进行「自我审查」,避免被拒.ASO100 为大家收集整理了2015年 App Store 审核被拒的23个理由,并且附上官方拒绝 ...

  8. *** Assertion failure in -[UIApplication _runWithMainScene:transitionContext iOS9.1闪退问题解决

    错误原因在于 AppDelegate 中 didFinishLaunchingWithOptions 结束前 未定义 rootViewController,Xcode7规定必须要有rootViewCo ...

  9. UIColor+Hex

    #import <UIKit/UIKit.h> @interface UIColor (Hex) + (UIColor *)colorWithHex:(long)hexColor;+ (U ...

  10. 数据结构之AVL树

    AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡.这种失去平衡的可以概括为4种姿态:LL ...