在开始之前,你应该了解如下知识:
完全二叉树的性质
线段树的原理及使用
图的存储方式及图论基础
我们首先看一道题:洛谷链接/CodeForces链接/Vjudge链接
上面这道题,我们首先考虑暴力建边,无论前面的建图部分还是后面的最短路,显然都是会超时的,然后我们观察题目,题目中提到每次对一整个[i, j]区间执行同一操作,所以我们考虑使用一些数据结构进行优化。
线段树优化建图
我们考虑,如果建立一个线段树,再用线段树上的节点代表区间,既然同一个操作对于区间的每条边权值都相同,那么不就可以用图上单点向线段树上节点的一条边来表示一个点与一个区间之间的 j - i + 1 条边了吗?
所以我们考虑这样的数据结构:

用图中蓝色的边表示 2号点 连向区间 [1, 4] 的边。
想法不错,可惜构不成完整的图,我们也许可以这样表示边的信息,但任何图论算法在这样的存储模式下都无法得到良好的发挥。主要矛盾在于,无法通过区间详细地表示点的编号,怎样让区间联系起来呢?很简单,让区间与单点建立联系就好了!单点是属于区间的,所以区间一定能够到达单点。

我们在线段树的节点之间建立红色的边,每条边的边权为零, 这样就可以表示具体的区间与其中包含的单点之间的联系了,

这篇博客介绍了如何利用线段树优化解决区间操作下的图建模和最短路径问题。通过建立出树和入树两棵线段树,分别处理边指向区间和区间出发的边,再用中间的边连接,形成图结构。博主展示了如何在线段树上进行区间建边,并给出了Dijkstra算法求解最短路径的实现。
最低0.47元/天 解锁文章
1101

被折叠的 条评论
为什么被折叠?



