1189: [HNOI2007]紧急疏散evacuate
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3831 Solved: 1119
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
XXXXX
X...D
XX.XX
X..XX
XXDXX
Sample Output
HINT
2015.1.12新加数据一组,鸣谢1756500824
这题网络流真恶心。。。
二分+最大流
由源点S连向每个空地,容量为1
二分时间time,将每个门拆成time个点,从门bfs到空地(人),如果从空地到门能在x的时间内到达,则将空地连向第x扇门
每扇门连向汇点,容量为1,表示单位时间内只能出去一个人
然后每扇门向下一扇门连线,容量为INF,表示多出来的人等下一扇门
PS:网上大多数题解有错误
4 5
XXXDX
XXX.X
X.X.D
.....
ans=6
大部分题解没有考虑门在单位时间内只能出一人
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; #define ID(i,j) (i*m+j)
const int INF=0x7f7f7f7f;
const int MAXN=;
const int xx[]={-,,,};
const int yy[]={,,-,}; struct Edge
{
int to,w,next;
}E[MAXN];
int node=,head[MAXN],dis[MAXN];
int s=,t=1e5+;
int n,m,ans,sum; int mp[][]; void insert(int u,int v,int w)
{
E[++node]=(Edge){v,w,head[u]};
head[u]=node;
E[++node]=(Edge){u,,head[v]};
head[v]=node;
} bool bfs()
{
memset(dis,-,sizeof(dis));
queue<int> Q;
Q.push(s);
dis[s]=;
while(!Q.empty())
{
int q=Q.front();Q.pop();
for(int i=head[q];i;i=E[i].next)
if(E[i].w&&dis[E[i].to]==-)
{
Q.push(E[i].to);
dis[E[i].to]=dis[q]+;
}
}
return dis[t]!=-;
} int dfs(int x,int flow)
{
if(x==t) return flow;
int w,used=;
for(int i=head[x];i;i=E[i].next)
if(E[i].w&&dis[E[i].to]==dis[x]+)
{
w=flow-used;
w=dfs(E[i].to,min(w,E[i].w));
E[i].w-=w;
E[i^].w+=w;
used+=w;
if(used==flow)return flow;
}
if(!used) dis[x]=-;
return used;
} void dinic()
{
while(bfs()) ans+=dfs(s,INF);
} struct NODE
{
int x,y,t;
};
int cnt=; void bfs(NODE N,int time)
{
bool vis[][];
queue<NODE> Q;
memset(vis,,sizeof(vis));
for(int i=;i<;i++)
{
int x=N.x+xx[i],y=N.y+yy[i];
if(!vis[x][y])
{
Q.push((NODE){x,y,});
vis[x][y]=;
}
}
while(!Q.empty())
{
NODE T=Q.front();Q.pop();
if(T.x<||T.x>n||T.y<||T.y>m) continue;
if(T.t>time) continue;
if(mp[T.x][T.y]!=) continue;
for(int i=;i<;i++)
{
int x=T.x+xx[i],y=T.y+yy[i];
if(!vis[x][y])
{
Q.push((NODE){x,y,T.t+});
vis[x][y]=;
}
}
insert(ID(T.x,T.y),cnt*+T.t,);
}
} bool check(int x)
{
cnt=;
node=;ans=;
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]==) insert(s,ID(i,j),);
else if(mp[i][j]==-)
{
cnt++;
insert(cnt*+,t,);
for(int k=;k<=x;k++)
{
insert(cnt*+k,t,);
insert(cnt*+k-,cnt*+k,INF);
}
bfs((NODE){i,j,},x);
}
dinic();
if(ans==sum) return true;
return false;
} int main()
{
char ch[];
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
for(int j=;j<=m;j++)
if(ch[j]=='.') sum++;
else if(ch[j]=='X') mp[i][j]=;
else if(ch[j]=='D') mp[i][j]=-;
}
int left=,right=n*m;
while(left<right)
{
int mid=(left+right)>>;
if(check(mid)) right=mid;
else left=mid+;
}
if(right==n*m) printf("impossible");
else printf("%d",right);
return ;
}
1189: [HNOI2007]紧急疏散evacuate的更多相关文章
- BZOJ 1189: [HNOI2007]紧急疏散evacuate( BFS + 二分答案 + 匈牙利 )
我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利 ...
- bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流
[HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3626 Solved: 1059[Submit][St ...
- 【BZOJ】1189: [HNOI2007]紧急疏散evacuate(二分+bfs+网络流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 表示完全不会QAQ.... 于是膜拜题解orz 二分时间........... 于是转换成判定 ...
- BZOJ 1189 [HNOI2007]紧急疏散evacuate
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...
- 1189: [HNOI2007]紧急疏散evacuate - BZOJ
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...
- bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- Bzoj1189 [HNOI2007]紧急疏散evacuate
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 715 Descr ...
- BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 412[Submi ...
- bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...
随机推荐
- [转]Tetris(俄罗斯方块) in jQuery/JavaScript!
本文转自:http://pwwang.com/2009/10/25/tetris-in-jquery-javascript/ All in jQuery/JavaScript + HTML! Demo ...
- vue中遇到的坑
如何解决在vue中替换图片.一个使用base64,而我们使用zepto之后,src找不到资源,因为已经打包了,难道强行写base64. 1. 引入文件时语法很重要! import "Foot ...
- ubuntu install fonts
sudo apt-get install ttf-wqy-zenhei
- 连接MySql的时候报1130的错误解决办法
部署了一个 数据库采用Mysql的程序,sqlyog连接非本地的Mysql服务器的数据库,居然无法连接很奇怪,报1130错误,ERROR 1130: Host 192.168.3.100 is not ...
- 在DataColumn.Expression把DateTime转换成String的问题
我在使用MySql5.1的数据库中,使用winForm的DataGridView要把数据库中全称DateTime格式,转换成Date格式,就是把日期时间转换成日期,不要时间.如‘2013-07-08 ...
- python处理字符串:将字符串中的数字相加求和
计算字符串中所有数字的和,字符串中有数字和字母组合而成如果出现连续数字,按照一个数操作具体解释在代码行里: def sum_str(str1): len1=len(str1) #首先将字符串str1的 ...
- vue2.0高仿饿了么better-scroll
首先安装better-scroll npm i better-scroll -S goods页面模板 <template> <div class="goods"& ...
- Xposed截获 Android手机QQ密码
0x00 前言 Xposed框架是一款修改系统框架服务的软件,通过它许多功能强大的模块得以实现,且不冲突地同时运作,自从Xposed框架发布以来,安卓手机的可玩性日益激增,最近很闲很蛋疼,研究下截获A ...
- SpringCloud的学习记录(3)
这一章节讲搭建config-server的项目. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Arti ...
- AWS ELB Sticky Session有问题?别忘了AWSELB cookie
我们的产品中有两个Module,分别部署在独立的Linux机器上,Module 1需要向Module 2发起Http请求来获得服务.由于Module 2有多台,因此我们会在Module 2前部署一台负 ...