返回

从探索到精通:图和并查集知识点全面解读

后端

算法简介

图论

图论是一门研究图结构和图算法的数学分支。图由顶点(或节点)和边(或弧)组成,顶点表示实体,边表示顶点之间的关系。图论在计算机科学、网络理论、运筹学等领域有着广泛的应用。

并查集

并查集是一种数据结构,用于处理不相交集合的合并和查找操作。并查集通常用树形结构来表示,其中每个集合对应一个连通分量。并查集在算法设计和数据结构中有着广泛的应用,例如,用于求解最小生成树、最短路径问题等。

题目解析

leetcode 1631. Path With Minimum Effort(python)题目如下:

给你一个 m x n 的矩阵 heights ,其中 heights[i][j] 表示在 (i, j) 处的高度。
一个机器人从 (0, 0) 出发,想要到达 (m-1, n-1) 。机器人只能在相邻的四个方向移动,且每次移动,机器人都会疲劳,疲劳值等于它经过的路径中高度差的绝对值。
请你返回机器人能够到达 (m-1, n-1) 的最小疲劳值。

示例 1:
输入:heights = [[1,2,2],[3,8,2],[5,3,5]]
输出:2
解释:路径 (0, 0) -> (0, 1) -> (0, 2) -> (1, 2) -> (2, 2) -> (2, 1) -> (2, 0) -> (1, 0) -> (0, 0)
    该路径的最小疲劳值为:2 + 0 + 3 + 1 + 0 + 1 + 2 + 2 + 1 = 12

示例 2:
输入:heights = [[1,2,3],[3,8,4],[5,3,5]]
输出:1

示例 3:
输入:heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
输出:0

为了解决此题,我们需要用到图论和并查集的相关知识。

算法实现

图的构建

首先,我们将给定的矩阵转换为图结构。矩阵中的每个元素对应图中的一个顶点,相邻的元素之间存在一条边。边的权重等于两个顶点的高度差的绝对值。

并查集的初始化

接下来,我们需要初始化并查集。并查集的每个元素对应图中的一个连通分量。我们将矩阵中的每个元素初始化为一个独立的连通分量。

边排序

接下来,我们需要将图中的所有边按权重从小到大进行排序。

并查集合并

现在,我们可以开始合并并查集中的连通分量了。我们将从权重最小的边开始,如果边的两个顶点属于不同的连通分量,则将这两个连通分量合并成一个连通分量。

最小疲劳值计算

当所有边都被处理完后,我们将得到一个包含所有连通分量的并查集。我们只需要找到包含(0, 0)和(m-1, n-1)的连通分量,那么这个连通分量的最小边权值就是机器人从(0, 0)到达(m-1, n-1)的最小疲劳值。

代码实现

def minimumEffortPath(heights):
    # 图的构建
    m, n = len(heights), len(heights[0])
    edges = []
    for i in range(m):
        for j in range(n):
            if i > 0:
                edges.append(((i-1, j), (i, j), abs(heights[i][j] - heights[i-1][j])))
            if j > 0:
                edges.append(((i, j-1), (i, j), abs(heights[i][j] - heights[i][j-1])))

    # 并查集的初始化
    parent = [i for i in range(m * n)]

    # 边排序
    edges.sort(key=lambda edge: edge[2])

    # 并查集合并
    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    def union(x, y):
        px, py = find(x), find(y)
        if px != py:
            parent[px] = py

    # 最小疲劳值计算
    for edge in edges:
        x, y, weight = edge
        union(x, y)
        if find(0) == find(m * n - 1):
            return weight

    return -1

# 测试
heights = [[1,2,2],[3,8,2],[5,3,5]]
print(minimumEffortPath(heights))  # 2

heights = [[1,2,3],[3,8,4],[5,3,5]]
print(minimumEffortPath(heights))  # 1

heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
print(minimumEffortPath(heights))  # 0

总结

通过结合图论和并查集的知识,我们可以高效地解决leetcode 1631. Path With Minimum Effort(python)题目。希望这篇文章能够帮助您更好地理解图论和并查集的相关知识点,从而解决更多类似的问题。