返回
算法刷题:轻松搞定洛谷P1661扩散(三种解法)
后端
2023-11-10 21:44:06
算法刷题【洛谷P1661】扩散(三种解法:最小生成树 + 二分&并查集 + Floyd弗洛伊德)
在算法的学习和应用中,刷题是一个非常重要的环节,它可以帮助我们巩固所学知识,提高算法思维能力,为实际工作打下坚实的基础。洛谷P1661扩散题就是一个非常经典的算法题,它不仅考察了我们的算法知识,还考验了我们的思维能力。
这道题的题目如下:
在一个n×m的网格中,每个点每过一个单位时间就会向四个方向扩散一个距离,如图所示:

给定一个n×m的网格,每个点都有一个权值,求从(1,1)点出发,到(n,m)点最短路径的权值和。
这道题可以有多种不同的解法,这里介绍三种比较常用的方法:最小生成树 + 二分法、并查集,以及Floyd-Warshall算法。
最小生成树 + 二分法
最小生成树 + 二分法是一种非常经典的算法,它可以用来解决许多最短路径问题。这种方法的基本思想是:
- 将所有点看成是图中的顶点,将所有边看成是图中的边,边的权值就是两个点之间的距离。
- 找到图中的最小生成树,最小生成树是一棵连接所有顶点的树,并且树上的边权值和最小。
- 使用二分法来找到从(1,1)点到(n,m)点最短路径的权值和。
二分法的具体步骤如下:
- 将最小生成树上的边权值从小到大排序。
- 二分搜索最小生成树上的边权值,找到一个边权值,使得从(1,1)点到(n,m)点最短路径的权值和等于这个边权值。
并查集
并查集是一种非常常用的数据结构,它可以用来解决许多集合相关的问题。这种方法的基本思想是:
- 将每个点看成是一个集合,每个集合包含一个或多个点。
- 使用并查集来维护这些集合,并查集提供了一些操作,比如查找一个点所属的集合、合并两个集合等。
- 从(1,1)点出发,不断地向四个方向扩散,如果遇到一个点已经属于某个集合,则停止扩散;如果遇到一个点不属于任何集合,则创建一个新的集合,并将这个点加入到这个集合中。
- 当(n,m)点被扩散到时,从(1,1)点到(n,m)点最短路径的权值和就是所有集合的权值和之和。
Floyd-Warshall算法
Floyd-Warshall算法是一种非常常用的最短路径算法,它可以用来解决所有点对之间的最短路径问题。这种方法的基本思想是:
- 将所有点看成是图中的顶点,将所有边看成是图中的边,边的权值就是两个点之间的距离。
- 使用Floyd-Warshall算法来计算所有点对之间的最短路径。
- 从(1,1)点到(n,m)点最短路径的权值和就是Floyd-Warshall算法计算出的(1,1)点到(n,m)点最短路径的权值。
这三种方法各有其优缺点,最小生成树 + 二分法适用于边权值比较小的情况,并查集适用于集合比较多的情况,Floyd-Warshall算法适用于所有点对之间的最短路径问题。