P3573 [POI 2014] RAJ-Rally 做题记录

news/2025/3/1 17:42:56/文章来源:https://www.cnblogs.com/XP3301Pipi/p/18745198

P3573 [POI 2014] RAJ-Rally 做题记录

Description

给定一个 \(n\) 个点 \(m\) 条边的有向无环图,每条边长度都是 \(1\)

请找到一个点,使得删掉这个点后剩余的图中的最长路径最短。

\(2\le n\le5\times10^5\)\(1\le m\le10^6\)

Solution

如果不删掉任何点,答案怎么求呢?

注意到给出的图是一个 DAG,那么我们建立一个超级源点 \(S\) 和一个超级汇点 \(T\),可以用正反两遍拓扑排序 \(O(n)\) 求出每个点的 \(dis(S\rightarrow i)\)\(dis(i \rightarrow T)\)

我们令 \(dis(S\rightarrow S)=dis(T\rightarrow T)=-1\),我们枚举所有边 \((u\rightarrow v)\),答案就是 \(dis(S\rightarrow u)+dis(v\rightarrow T)+1\) 的最大值。

如果我们删掉了一个点,答案又该怎么求呢?

我们在拓扑排序中处理出拓扑序。删掉点 \(x\) 之后,点被分为两部分:拓扑序在 \(x\) 之前的点集 \(X\),拓扑序在 \(x\) 之后的点集 \(Y\)

那么答案就有三种情况:

  1. \(\max_{p\in X}(dis(S\rightarrow p))\)
  2. \(\max_{p\in Y}(dis(p\rightarrow T))\)
  3. \(\max_{p\in X,q\in Y} (dis(S\rightarrow p)+dis(q\rightarrow T)+1)\)\((p\rightarrow q)\in E\)

由于 \(Y\) 中的点的拓扑序都在 \(X\) 中的点之后, 所以不存在一条边 \((u\rightarrow v)\),使得 \(u\in Y,v\in X\)

前两种情况是好处理的,但第三种呢?

我们拿出拓扑序最小的点 \(u\),其答案为 \(\max_{p\ne u} (dis(p\rightarrow T))\)

假如我们已经求出了拓扑序在 \([1,i-1]\) 中的点的答案。我们把 \(X,Y\) 两个集合维护出来,现在 \(X\) 中的点拓扑序都小于 \(i\)\(Y\) 中的点都大于等于 \(i\)

我们把拓扑序为 \(i\) 的这个点 \(v\)\(Y\) 中拿出来。删掉 \(v\) 之后,\(dis(v\rightarrow T)\) 和所有的 \(dis(S\rightarrow z)+dis(v\rightarrow T)+1 \ ((z\rightarrow v)\in E)\) 都作废了。剩余的最大值就是 \(v\) 的答案。

接着,我们把 \(v\) 加入到 \(X\) 中。\(dis(S\rightarrow v)\) 与所有的 \(dis(S\rightarrow v)+dis(z\rightarrow T)+1 \ ((v\rightarrow z)\in E)\) 生效。

我们需要一个支持插入、删除、查询最大值的数据结构。multiset 维护即可。

时间复杂度为 \(O((n+m)\log (n+m))\)

int n,m;
struct Edge{int to,nxt,tp;
}edge[M<<1];int topo[N],head[N],tot,in[N],dis1[N],dis2[N];void Add(int u,int v,int tp){edge[++tot]={v,head[u],tp};head[u]=tot;
}signed main(){read(n),read(m);for(int i=1;i<=n;i++){Add(0,i,0);in[i]=1;}for(int i=1;i<=m;i++){int u,v;read(u),read(v);Add(u,v,0);Add(v,u,1);in[v]++;}queue<int> q; q.push(0); tot=-1;dis1[0]=-1;while(q.size()){int x=q.front(); q.pop();topo[++tot]=x;for(int i=head[x];i;i=edge[i].nxt){if(edge[i].tp) continue;int t=edge[i].to;Ckmax(dis1[t],dis1[x]+1);if(!(--in[t])) q.push(t);}}for(int i=n;i;i--){int x=topo[i];for(int j=head[x];j;j=edge[j].nxt){if(edge[j].tp) continue;int t=edge[j].to;Ckmax(dis2[x],dis2[t]+1);}}multiset<int> s;for(int i=1;i<=n;i++) s.insert(dis2[i]);int ans=IINF,frm=0;for(int i=1;i<=n;i++){int x=topo[i];for(int j=head[x];j;j=edge[j].nxt){if(!edge[j].tp) continue;int t=edge[j].to;s.erase(s.find(dis2[x]+dis1[t]+1));}s.erase(s.find(dis2[x]));if(s.size()){int res=*s.rbegin();if(res<ans) ans=res,frm=x;}s.insert(dis1[x]);for(int j=head[x];j;j=edge[j].nxt){if(edge[j].tp) continue;int t=edge[j].to;s.insert(dis1[x]+dis2[t]+1);}}printf("%d %d\n",frm,ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难? 我总结了四篇近期的研究论文,来展示AI是如何以及为什么侵蚀我们的批判性思维能力。作者使用AI制作的图像前言:作者在这篇文章中,借AI技术的崛起,揭示了一场悄然发生的思想博弈。表面上,AI为我们带来了前所未有的效率与便捷,但在无形之中,…

44页太阳花绘制

点击查看代码 from turtle import * color(red, yellow) begin_fill() while True:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

leetcode hot 15

解题思路:思路还是比较清晰,先按照起始位置排序,然后再逐个遍历,根据起始位置与前一个结束位置进行比较,两种情况进行处理即可(这边代码比较麻烦因为前面list泛型用错了) import java.util.Arrays; class Solution {public int[][] merge(int[][] intervals) {List<Lis…

WgelCTF打靶笔记(2)

参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&vd_source=e948147c25027ef3216b5c376b31fc96扫描dirb: 发现.ssh有一个id_rsa文件,即ssh连接私钥,右键下载到本地 ssh私钥: SSH:用于安全的连接到远程服务器 …

44页五角星绘制

点击查看代码 from turtle import * fillcolor("red") begin_fill() while True:forward(200)right(144)if abs(pos()) < 1:break end_fill()

Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进。让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 https://github.com/voidint/g/releases 下载适合您系统的版本。例如,如果您的系统是 64 位的,可以下载 g1.7.0.window…

FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)

title: FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 date: 2025/3/1 updated: 2025/3/1 author: cmdragon excerpt: 用虚拟环境打造纯净开发空间的3种方法 只需5行代码实现智能API端点 自动生成媲美大厂的交互式API文档 解决新手必踩的9大坑点(含依赖…

rocketmq不同服务使用相同消费者组和生产者组的问题

之前多个服务使用同一个消费者组和生产者组procfg-consumer-group和procfg-produce-group,然后共享同一个Topic。 时不时会有问题,例如主控服务版本更新之后虽然消息发出来了,但是终端接收不到,消息有时会有CONSUMED_BUT_FILTERED(被过滤)个人理解的原因是多个服务用同一个…

用python画了一个五星红旗

点击查看代码 import turtle# 设置屏幕 screen = turtle.Screen() screen.bgcolor("white") screen.setup(width=800, height=600) # 设置窗口大小# 设置画笔 pen = turtle.Turtle() pen.speed(10) pen.penup()# 绘制红旗背景 def draw_rectangle(color, width, hei…

gitlab使用自建nginx反向代理

参考文档:https://www.cnblogs.com/suruozhong/p/12468167.html 一、修改配置文件 vim /etc/gitlab/gitlab.rb# 让gitlab的内置nginx监听9002端口 nginx[listen_port] = 9002# 设置gitlab的访问路径(是通过外部nginx反向代理访问的) external_url http://域名/git例如: # 让…

Codeforces Round 1007 (Div. 2) 比赛记录

Codeforces Round 1007 (Div. 2) 比赛记录 比赛链接 很喜欢的一场比赛,题目质量很高,不是手速场,做出题超级有成就感,赛时切掉了 A - D1,上大分了。 B卡得有点久,其实是一个很常用的构造手法但一开始没想到。 过题记录:A. The Play Never Ends 题意大概就是,每场两个人…

20241901 《网络攻防实践》第1周作业 丁奕中

网络拓扑图 ,受限于内存,我只配置了四台虚拟机:虚拟机 角色kali 攻击机seed 主机Win2000server 靶机Honeywall 蜜网网关因为先解压好了Honeywall,所以先安装提权后没进配置菜单,然后意识到新建虚拟机的时候不能直接打开,重新建一次加两块网卡,分别是VMnet1和VMnet8这次启…