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个点连边,流量 ...
随机推荐
- aspx页面导出为word
aspx页面导出为word代码: System.IO.StringWriter sw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWri ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- HDU 4349——Xiao Ming's Hope——————【Lucas定理】
Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ThinkPHP find大坑 不要随便用
举例: M("User")->find(3); $m=M("User"); $m->userName="aaa"; $m-> ...
- DNN学习笔记 最简单的皮肤制作
说明: 在学习DNN时,使用的版本为 DNN8.参考资料:http://www.dnnsoftware.com/docs/designers/creating-themes/index.html 制作 ...
- ZR国庆Round2解题报告
心路历程 预计得分:100 + 10 - 20 + 10 = 120 实际得分:100 + 0 + 10 = 110 感觉这场打的挺稳的.开场秒掉A题,写+调差不多1h 然后刚T3暴力,刚完还有2h左 ...
- SublimeText插件cssrem : px转换为rem
步骤: 下载插件: https://github.com/flashlizi/cssrem 安装插件: 打开:Sublime Text 点击: Preferences 选择: Browse Packa ...
- c#语言自增自减运算符深入剖析
C语言的++和--对于初学者来说一直都是难题,甚至很多老手也会产生疑惑; 最大的问题在于 ++可以放在变量后面,也可以放在前面; 如 i++; ++i; 自减运算符与++原理一样,只是变量变价为减而已 ...
- <Android 基础(十五)> Alert Dialog
介绍 The AlertDialog class allows you to build a variety of dialog designs and is often the only dialo ...
- ArcGIS数据存储的方式
工作空间文件夹和地理数据库为存储和管理ArcGIS地理信息提供了主要容器.工作空间文件夹只是磁盘上的普通文件夹,它可保存大量的文件地理数据库.个人地理数据库.基于文件的数据集以及一系列ArcGIS文档 ...