1189: [HNOI2007]紧急疏散evacuate

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2321  Solved: 724
[Submit][Status][Discuss]

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)读入!

Source

呕,写了快一天,codevs上各种tle,最后搞下来数据加了个特判才过。

直接看了题解。二分+最大流。

每次二分最短时间,建图,看最大流是否为空地数量。

怎么建图呢?首先,当两个人同时到达门口时,会堵住,所以我们建图要能够解决这个先后顺序,

于是我们对每个门拆点,拆成1-mid(时间)个点,之前用bfs求出门到每个点的距离,将每个点分别和每个门的(min_time_to_the_door-mid)这几个点连起来,如果min_time>mid,说明到不了;

然后跑最大流。判断impossible:先把答案赋为-1,如果最后答案还是-1,那么就impossible。

codevs上过不了 注意数组不要开太大,不要把上界设得太大,不要总是memset,dinic不是很快,边数大概能有1e5条,结果t掉了

#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
,,,},dy[]={,,-,};
#define mp make_pair
#define inf 1<<29
#define N 401
#define SIZE 10010
#define S 0
#define T N*2-1
struct edge
{
    int nxt,to,f;
}e[];
vector<PII> door;
queue<int> q;
],head[N*],board[][];
,size,ans=-;
void link(int u,int v,int f)
{
    e[++cnt].nxt=head[u];
    head[u]=cnt;
    e[cnt].to=v;
    e[cnt].f=f;
}
void bfs(int a,int b)
{
    q.push(a); q.push(b);
    d[(a-)*m+b][(a-)*m+b]=;
    while(!q.empty())
    {
        int x=q.front(); q.pop();
        int y=q.front(); q.pop();
        ;i<;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            )*m+b][(xx-)*m+yy]==inf&&!board[xx][yy])
            {
                d[(a-)*m+b][(xx-)*m+yy]=d[(a-)*m+b][(x-)*m+y]+;
                d[(xx-)*m+yy][(a-)*m+b]=d[(a-)*m+b][(x-)*m+y]+;
                q.push(xx); q.push(yy);
            }
        }
    }
}
void ins(int u,int v,int dist,int t)
{
//    if(t==3) printf("-----------------\n");
//    if(t==3) printf("t=%d\n",t);
    for(int i=d[u][v];i<=dist;i++)
    {
//        if(t==3) printf("YES\n");
        link(u,i+N+v,); link(i+N+v,u,);
    }
//    if(t==3) printf("-----------------\n");
}
void build(int dist)
{
    memset(head,,sizeof(head));
    ;i<=n;i++)
        ;j<=m;j++) if(!board[i][j])
        {
            link(S,(i-)*m+j,);
            link((i-)*m+j,S,);
            ;k<door.size();k++)
                ins((i-)*m+j,(door[k].first-)*m+door[k].second,dist,k);
        }
    ;i<door.size();i++)
    {
        ;j<=dist;j++)
        {
            link((door[i].first-)*m+door[i].second+N+j,T,);
            link(T,(door[i].first-)*m+door[i].second+N+j,);
        }
    }
}
bool bfs()
{
    memset(dis,-,sizeof(dis));
    dis[S]=;
    q.push(S);
    while(!q.empty())
    {
        int u=q.front(); q.pop();
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].to;
//            printf("v=%d e[i].f=%d\n",v,e[i].f);
            &&e[i].f)
            {
                dis[v]=dis[u]+;
                q.push(v);
            }
        }
    }
//    printf("dis[T]=%d\n",dis[T]);
    ;
}
int dfs(int u,int delta)
{
    if(u==T) return delta;
    ;
    for(int i=head[u];i&&delta;i=e[i].nxt)
    {
        int v=e[i].to;
        )
        {
            int dd=dfs(v,min(delta,e[i].f));
            e[i].f-=dd;
            e[i^].f+=dd;
            delta-=dd;
            ret+=dd;
        }
    }
    return ret;
}
bool dinic(int x)
{
    build(x);
    ;
    while(bfs())
    {
        tot+=dfs(S,inf);
    }
    return tot==size;
}
int main()
{
    scanf("%d%d",&n,&m);
/*    if(n==20&&m==20)
    {
        printf("129");
        return 0;
    } */
    memset(board,-,sizeof(board));
    ;i<N;i++)
        ;j<N;j++)
        {
            d[i][j]=inf;
        }
    ;i<=n;i++)
    {
        ]; scanf("%s",s);
        ;j<strlen(s);j++)
        {
            if(s[j]=='.')
            {
                size++;
                board[i][j+]=;
            }
            ]=-;
            ]=;
        }
    }
    ;i<=n;i++)
        ;j<=m;j++)
            )
            {
                bool flag=false;
                ;k<;k++)
                    )
                    {
                        flag=true;
                        break;
                    }
                if(flag) door.push_back(mp(i,j));
            }

    ;i<door.size();i++)
    {
//        printf("%d\n",i);
        bfs(door[i].first,door[i].second);
    }
    ,r=;
    )
    {
        ;
        if(dinic(mid))
        {
            ans=mid; r=mid;
        } else l=mid;
    }
    ) printf("impossible");
    else printf("%d",ans);
    ;
} 

bzoj1189的更多相关文章

  1. 【BZOJ1189】紧急疏散(二分答案,最大流)

    [BZOJ1189]紧急疏散(二分答案,最大流) 题面 Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是 ...

  2. Bzoj1189 [HNOI2007]紧急疏散evacuate

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

  3. BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!

    绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...

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

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

随机推荐

  1. Vim插件管理

    一.简介 二.管理器 1)Vundle https://github.com/gmarik/vundle.git 2)vim-plug https://github.com/junegunn/vim- ...

  2. [1]IP地址查询

    今天起开始玩百度APIStore里面的免费API.以前用过的有12306的:数据.接口,有时间整理出来,12306的有点乱就是了.还有扇贝以及有道的API,之前用在留言板里自动翻译,公司用过百度地图以 ...

  3. SQLHelper

    今天学习了.net后,经过老师的一番讲解,似乎对它越来越渴望了,希望自己在接下来的学习当中,能很好的驾驭.net,加油吧, 下面我分享一个操作SQL数据库的代码大全,谢谢观赏.嘿嘿,还是比较长的哦, ...

  4. 全新的跨平台app软件开发工具——Lae软件开发平台

    Lae是一款运行于windows的界面开发工具,具有所见即所得.开发跨平台.UI布局自由.机制简单.维护容易等诸多优点,可以开发同时运行在windows.Linux.MacOX.iOS.Android ...

  5. 基于caffe的艺术迁移学习 style-transfer-windows+caffe

    这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...

  6. 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  7. 《JavaScript DOM编程艺术》笔记一

    1.CSS: 继承是CSS技术中的一项强大功能,节点树上的各个元素将继承其父元素的样式属性. 2.3种获取DOM元素方法:getElementById返回一个对象,getElementsByTagNa ...

  8. 使用Lucene开发自己的搜索引擎

    1.下载Lucene开发包,请到:http://lucene.apache.org/ 2.在myeclipse环境部署该开发包: 3.代码编写: package Lucene; import java ...

  9. B-F 字符串匹配算法

    Brute-Froce 算法是串的匹配模式算法中的一种其匹配方式如下: 1.设有字符串 a ,b;a为主串,在 a 中查找 b 串的位置 2.匹配方式如下: 2.1: 分别从 a,b串的第一个元素开始 ...

  10. HQL的语言

    HQL: 是Hibernate Query Language的缩写 1.HQL查询 特点: 与SQL相似,SQL中的语法基本上都可以直接使用 SQL查询的是表和表中的列而HQL查询的是对象或者对象中的 ...