ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[NOI2018] 归程,Kruskal 重构树

2022-01-27 23:33:00  阅读:151  来源: 互联网

标签:连通 询问 短路 路径 节点 排序 NOI2018 Kruskal 归程


给出一张点数为 \(n\),边数为 \(m\) 的无向连通图,每个边 \(e\) 的属性是一个二元组 \((l,a)\)。

接下来给出 \(q\) 次询问,每次给出一个出发点 \(v\) 以及约束 \(p\),求出从 \(v\) 至 \(1\) 号节点的最小花费。

花费的计算是这样的:将 \(p(v,1)\) 分为两段 \(p(v,u)\),\(p(u,1)\)。

\(p(v,u)\) 满足所有的经过边 \(e\in p(v,u)\) 都有 \(a_e > p\),这段路径是免费的。

从第一次经过 \(a_e\leq p\) 的边开始,这一段路径为 \(p(u,1)\),这段路径的花费是 \(\sum_{e\in p(u,1)}l_e\)。

假若询问离线,我们可以考虑将询问按照 \(p\) 从大到小排序,然后将图中的边按照 \(a\) 排序,开始是一个仅有点没有边的图,然后逐渐按顺序向其中加边,当当前询问的约束为 \(p\) 时,将所有 \(a>p\) 的边加入其中。

那么这个过程中整个图就会形成若干个连通块,假若当前起点 \(v\) 属于某个连通块 \(B\),那么任何以 \(u\in B\) 为起点的答案都是一样的。因为任意边 \(e\in B\) 都有 \(a_e>p\),是属于第一种路径,所以这部分路径是对答案没有贡献的。

于是我们考虑先预处理出所有点至 \(1\) 号节点的 \(l\) 值的最短路,这个可以直接以 \(1\) 号节点为起点跑一遍 Dijkstra(关于 SPFA,,,

然后关于连通块我们就可以直接用并查集维护,按照最短路的值合并。具体地说,就是以最短路值小的节点作为根,于是当我们处理询问时只需 find 一下根,再输出其最短路值即可。

离线的好处是,由于我们已经对询问排序,加入的边不会再被去掉,这样就可以直接用并查集维护了。时间复杂度 \(O( m\log n+q\log n)\)。

标签:连通,询问,短路,路径,节点,排序,NOI2018,Kruskal,归程
来源: https://www.cnblogs.com/yukari1735/p/15851621.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有