bzoj1189: [HNOI2007]紧急疏散evacuate

2024-04-02 10:32

本文主要是介绍bzoj1189: [HNOI2007]紧急疏散evacuate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1189

思路:一种简单的网络流建图:

预处理两点间距离

从S向每个空地连1的边,每个空地向它在二分的时间内能到的出口连边,出口在向汇连T的边

这也是很多题解的做法

但这是错的...

当很多人距离门很远时,他们就可能在时间快到时堆在门口出不去,这种建图就忽略了这一点


所以我们要拆点

还是二分最大时间T,从S向每个空地连1的边

把每个门拆成T个点,表示每个时间,由每个点向汇连容量为1的边,表示每个时间只能出去一个人

然后由时间早的点向后一个时间的点连边,表示可以在门口等待到下一个时间出去

每个空地向它最早到达这个门的时间所代表的点连1的边

判断最大流是否等于空地数即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
const int maxn=40010,maxm=1000010,inf=(int)1e9;
using namespace std;
int n,m,dis[510][510],map[25][25],dor[510],dcnt,blk[510],bcnt,head,tail;char ch[25][25];bool bo[25][25];
int pre[maxm],now[maxn],son[maxm],val[maxm],tot,di[maxn],S=maxn-2,T=maxn-1,maxt=80;
struct poi{int x,y;}q[510];
int id(int x,int y){return (x-1)*m+y;}void bfs(int sx,int sy){int st=id(sx,sy);memset(dis[st],63,sizeof(dis[st]));memset(bo,0,sizeof(bo));q[tail=1]=(poi){sx,sy};head=0,dis[st][st]=0,bo[sx][sy]=1;while (head!=tail){if (++head>500) head=1;poi a=q[head];for (int i=0;i<4;i++){int nx=a.x+dx[i],ny=a.y+dy[i];if (bo[nx][ny]) continue;if (map[nx][ny]==1){if (++tail>500) tail=1;bo[nx][ny]=1,dis[st][id(nx,ny)]=dis[st][id(a.x,a.y)]+1;q[tail]=(poi){nx,ny};}else if (map[nx][ny]==2)bo[nx][ny]=1,dis[st][id(nx,ny)]=dis[st][id(a.x,a.y)]+1;}}
}void init(){for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (map[i][j]==1) bfs(i,j),blk[++bcnt]=id(i,j);else if (map[i][j]==2) dor[++dcnt]=id(i,j);
}
struct Tflow{int q[maxn+10],head,tail;int id(int x,int tim){return (x-1)*maxt+tim+bcnt;}void add(int a,int b,int c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}void ins(int a,int b,int c){add(a,b,c),add(b,a,0);}void clear(){memset(now,0,sizeof(now)),tot=1;}bool bfs(){memset(di,-1,sizeof(di));q[1]=S,di[S]=0,head=0,tail=1;while (head!=tail){if (++head>maxm) head=1;int x=q[head];for (int y=now[x];y;y=pre[y])if (di[son[y]]==-1&&val[y]){if (++tail>maxm) tail=1;di[son[y]]=di[x]+1,q[tail]=son[y];}}return di[T]>0;}int find(int x,int low){if (x==T) return low;int y,res=0;for (y=now[x];y;y=pre[y]){if (!val[y]||di[son[y]]!=di[x]+1) continue;int tmp=find(son[y],min(low,val[y]));val[y]-=tmp,val[y^1]+=tmp,res+=tmp,low-=tmp;if (!low) break;}if (!y) di[x]=-1;return res;}bool dinic(int lim){int res=0;clear();for (int i=1;i<=bcnt;i++) ins(S,i,1);for (int i=1;i<=dcnt;i++) for (int j=1;j<=lim;j++){ins(id(i,j),T,1);if (j>1) ins(id(i,j-1),id(i,j),inf);}for (int i=1;i<=bcnt;i++)for (int j=1;j<=dcnt;j++){int x=blk[i],y=dor[j];if (dis[x][y]<=lim) ins(i,id(j,dis[x][y]),1);}while (bfs()) res+=find(S,inf);return res==bcnt;}
}Ts;void work(){int l=1,r=n*m,mid=(l+r)>>1,ans=-1;while (l<=r){if (Ts.dinic(mid)) r=mid-1,ans=mid;else l=mid+1;mid=(l+r)>>1;}if (ans==-1) puts("impossible");else printf("%d\n",ans);
}int main(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) scanf("%s",ch[i]+1);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (ch[i][j]=='D') map[i][j]=2;else if (ch[i][j]=='.') map[i][j]=1;init(),work();return 0;
}


这篇关于bzoj1189: [HNOI2007]紧急疏散evacuate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869742

相关文章

紧急 浮毛正在挑战免疫系统?推荐榜TOP3浮毛空气净化器使用体验

作为一名多猫家庭的铲屎官,出门路人必知道我养猫,不是把铲屎官三个字大大的打在我脑门上了。而是衣服、裤子上无处不在的猫毛,以前我就靠着人力与各种工具与猫毛斗争,但效果总是差强人意。直到有一天,我因忽视浮毛而患上了过敏性鼻炎,这才让我真正意识到问题的严重性。经过长时间的治疗和反思,我终于找到了解决浮毛方法。作为一个确确实实生过病,现在控制住的过来人,来跟大家详细聊聊浮毛的危害以及怎么能有效处理。

SCANV团队紧急预警“MetInfo后门事件”

前天,安全联盟站长平台安全技术人员发现的由于“MetInfo(米拓)企业网站管理系统”官方下载安装文件包里被非法篡改,植入了恶意网站木马后门代码文件及“黑链”代码。当站长用户下载安装后,导致网站被“感染”该恶意后门及“黑链”代码,使网站沦为“肉鸡”。安全联盟站长平台立即启动了应急方案,已积极联系MetInfo官方(目前官方已经紧急更新了对应下载安装文件包。),并发布紧急预警,请近期下载安

2017-05-13 紧急安全提醒,针对高校同学

原文链接:知乎-路人甲-紧急安全提醒,针对高校同学 原文链接:http://zkeeer.space 紧急安全提醒,针对高校同学   我的建议: 1.关闭445、135、137、138、139端口,方法文章里有 2.更新系统补丁,时刻开着你的防护软件,Win10用户打开更新和defender 3.备份你的重要文件到移动硬盘/U盘等外部不连网的存储设备 一个名为ONION勒索软件(永恒之蓝

【git之窗】(十七)线上问题如何拉取紧急分支

一、前提       通常使用git,都会在上线前把代码合并到master分支,在master上打好tag,由上线tag、回退tag确保上线正常。       例如:       上线tag: VINCENT_tag_V1.3.1       回滚tag: VINCENT_tag_V1.3.0   二、问题      如上所述,如果master上线的tag(VINCENT_tag_V

紧急更新!中国12.5米压缩包已更新上传,欢迎免费领取

最近接到不少读者留言,反馈中国12.5米的DEM地形瓦片数据通过百度网盘链接领取后下载,解压时发现有分卷压缩包错误的问题。因此我通过链接下载数据后进行解压测试,问题出现了:CRC校验失败!于是在网上搜索类似问题,发现这个问题是百度网盘的通病,有的说与网络有关,有的说与官方数据备份迁移有关,众说纷纭,没有一个确切的答案,如果大家针对这方面的问题有有效的办法,可以私信或者在文章末尾留言,在这里先提前谢

英伟达开源 3400 亿参数模型;苹果 iOS 18 紧急 SOS 新增实时视频功能丨 RTE 开发者日报 Vol.225

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留言、跟帖、讨论。 本期编辑:@CY,@JLT,@鲍勃 01有话题的新闻 1、英伟达开源

苹果发布云AI系统;谷歌警告0day漏洞被利用;微软紧急推迟 AI 召回功能;劫持活动瞄准 K8s 集群 | 网安周报0614

苹果发布私有云计算,开创 AI 处理新时代,隐私保护再升级! 苹果宣布推出一个名为“私有云计算”(PCC)的“开创性云智能系统”,该系统专为在云中以保护隐私的方式处理人工智能(AI)任务而设计。 这家科技巨头将 PCC 描述为“为云人工智能计算大规模部署的最先进安全架构”。 PCC 与新的生成式人工智能(GenAI)功能的到来相吻合——统称为苹果智能,或简称 AI——这是 iPhone

深挖Openstack Nova - evacuate疏散函数

一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。 这可以是OpenStack计算节点HA的一种实现方案。 二. API调用 nova.servers.evacuate(server=fm['id']), on_shared_storage=True 1. on_shared_storage参数在2.14版本后废除,自

BZOJ 1189 紧急疏散evacuate 二分+BFS+最大流

建图的时候需要拆点,按照每一个时间点拆点,主要可以保证每次只有一个人走出门。BFS处理出人到门的距离二分答案,判断是否可以建边,S指向每一块空地,空地到门如果可以建边就建一条容量为x的边每个门按照时间拆点,保证单位时间内走一次,然后跑最大流

【紧急警示】Locked勒索病毒利用最新PHP远程代码执行漏洞大规模批量勒索!文末附详细加固方案

1. Locked勒索病毒介绍 locked勒索病毒属于TellYouThePass勒索病毒家族的变种,其家族最早于2019年3月出现,擅长利用高危漏洞被披露后的短时间内,利用1Day对暴露于网络上并存在有漏洞未修复的机器发起攻击。该家族在2023年下半年开始,频繁针对国内常见大型ERP系统的漏洞进行攻击,并且会利用钓鱼邮件针对财务人员个人主机进行钓鱼和入侵攻击。 其曾经使用过的代表性漏洞有: