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

相关文章

英伟达开源 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系统的漏洞进行攻击,并且会利用钓鱼邮件针对财务人员个人主机进行钓鱼和入侵攻击。 其曾经使用过的代表性漏洞有:

后悔莫及?文件删除后,2个紧急恢复方法

我们用手机处理工作、学习、娱乐等各种事务,手机中存储了大量的重要文件,但手机的便利性也带来了一些问题,比如手机文件误删。你是否曾经因为一时手快,删除了重要的文件,然后急得像热锅上的蚂蚁?别担心,本文将为你介绍手机文件删除后的紧急恢复方法,让你在面对手机文件误删时,也能从容应对。 手机文件删除后的恢复方法 一旦发现文件被删除,应立即停止使用手机,避免产生新的数据覆盖旧数据。这是非常重

【文末附gpt升级秘笈】特斯拉的芯片转移决策:马斯克的紧急回应与薪酬计划的风险

特斯拉的芯片转移决策:马斯克的紧急回应与薪酬计划的风险 摘要: 本文探讨了特斯拉CEO埃隆·马斯克将原本预留给特斯拉的12000枚英伟达高端H100 GPU芯片优先发送给其旗下X和xAI公司的决策。这一行为引发了公众和投资者的广泛关注和质疑。马斯克紧急回应称此举是出于公司战略考虑,但此举无疑激化了特斯拉与X之间的矛盾,并可能损害特斯拉的利益和竞争力。此外,该决策还可能对马斯克的560亿美元薪酬计

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点: 在AI大模型领域,多项研究进展和行业应用动态引发关注。一夜之间,疑似一个GPT4.5的神秘模型刷屏。科学家Ellie Pavlick正致力于研究大语言模型中的理解证据,试图找到代表概念的神经网络部分,以推动语言模型领域向更直接的方法发

服务器渗透入侵紧急应对指南:技术实践与代码示例

引言 在网络安全的无尽战场中,服务器渗透入侵是每一个运维人员的噩梦。一旦服务器防线被突破,不仅数据安全岌岌可危,业务连续性也将遭受严重威胁。本文将深入探讨服务器被渗透后的紧急处理流程,并通过实际代码示例,展示如何高效地进行应急响应与恢复工作。 1. 立即隔离受侵服务器 首先,确保受损服务器与生产网络隔离,避免攻击者进一步扩散或利用现有资源。在Linux环境下,可以通过以下命令快速断开网络连接

微信团队回应引擎误翻:翻译非正式英文词汇会出现 正紧急修复

腾讯科技讯 针对微信翻译被网友曝光出现误翻问题. 腾讯微信团队3月3日下午在官微进行回应,称由于翻译引擎在翻译一些没有进行过训练的非正式英文词汇时出现误翻,导致部分语句翻译出现问题,目前正在紧急修复中。 哈哈哈?