python最小生成树kruskal与prim算法详解

yizhihongxing

Python最小生成树Kruskal与Prim算法详解

最小生成树是一种常用的图论问题,用于在一个加权无向图中找到一棵生成树,使得树上所有边的权值之和最小。本文将详细讲解Python实现最小生成树Kruskal与Prim算法的整个攻略,包括算法原理、实现过程和示例。

算法原理

Kruskal算法

Kruskal算法是一种基于贪心策略的最小生成树算法,其基本思想是将图中所有边按照权值从小到大排序,然后依次加入生成树中,直到生成树中包含所有节点为止。在加入每条边时,需要判断该边是否会形成环,如果不会形成环,则将该边加入生成树中。

具体来说,算法分为以下几个步骤:

  1. 将图中所有边按照权值从小到大排序。
  2. 初始化一个空的生成树。
  3. 依次遍历所有边,如果该边不会形成环,则将该边加入生成树中。
  4. 重复步骤3,直到生成树中包含所有节点为止。

Prim算法

Prim算法是一种基于贪心策略的最小生成树算法,其基本思想是从一个节点开始,依次加入与该节点相邻的最小权值边,直到生成树中包含所有节点为止。在加入每条边时,需要判断该边是否会形成环,如果不会形成环,则将该边加入生成树中。

具体来说,算法分为以下几个步骤:

  1. 选择一个起始节点,将该节点加入生成树中。
  2. 初始化一个空的边集。
  3. 遍历与生成树中节点相邻的所有边,将这些边加入边集中。
  4. 从边集中选择权值最小的边,如果该边不会形成环,则将该边加入生成树中。
  5. 重复步骤3和4,直到生成树中包含所有节点为止。

实现过程

以下是使用Python实现Kruskal算法的示例代码:

class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n

    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    def union(self, x, y):
        px, py = self.find(x), self.find(y)
        if px == py:
            return False
        if self.rank[px] < self.rank[py]:
            self.parent[px] = py
        elif self.rank[px] > self.rank[py]:
            self.parent[py] = px
        else:
            self.parent[py] = px
            self.rank[px] += 1
        return True

def kruskal(n, edges):
    uf = UnionFind(n)
    edges.sort(key=lambda x: x[2])
    res = []
    for u, v, w in edges:
        if uf.union(u, v):
            res.append((u, v, w))
    return res

上述代码中,首先定义了一个UnionFind类,用于实现并查集。在find方法中,查找节点的根节点。在union方法中,合并两个节点。在kruskal方法中,首先对所有边按照权值从小到大排序,然后依次加入生成树中,直到生成树中包含所有节点为止。

以下是使用Python实现Prim算法的示例代码:

import heapq

def prim(n, edges):
    graph = [[] for _ in range(n)]
    for u, v, w in edges:
        graph[u].append((v, w))
        graph[v].append((u, w))
    visited = [False] * n
    heap = [(0, 0)]
    res = []
    while heap:
        w, u = heapq.heappop(heap)
        if visited[u]:
            continue
        visited[u] = True
        res.append((u, w))
        for v, w in graph[u]:
            if not visited[v]:
                heapq.heappush(heap, (w, v))
    return res[1:]

上述代码中,首先将所有边转换为邻接表形式的图。然后使用堆来维护当前生成树与非生成树之间的边,每次选择权值最小的边加入生成树中,直到生成树中包含所有节点为止。

示例说明

以下是使用Kruskal算法求解最小生成树的示例代码:

n = 5
edges = [(0, 1, 2), (0, 3, 6), (1, 2, 3), (1, 3, 8), (1, 4, 5), (2, 4, 7), (3, 4, 9)]
res = kruskal(n, edges)
print(res)

上述代码中,首先定义了一个包含7条边的无向加权图,然后使用Kruskal算法求解最小生成树,并输出结果。

以下是使用Prim算法求解最小生成树的示例代码:

n = 5
edges = [(0, 1, 2), (0, 3, 6), (1, 2, 3), (1, 3, 8), (1, 4, 5), (2, 4, 7), (3, 4, 9)]
res = prim(n, edges)
print(res)

上述代码中,首先定义了一个包含7条边的无向加权图,然后使用Prim算法求解最小生成树,并输出结果。

总结

本文详细讲解了Python实现最小生成树Kruskal与Prim算法的整个攻略,包括算法原理、实现过程和示例。Kruskal算法和Prim算法都是常用的最小生成树算法,可以用于解决各种图论问题。在Python中,可以使用并查集和堆等数据结构来实现这两种算法,实现过程上述所示。通过示例看到Kruskal算法和Prim算法在实际应用中的灵活性和实用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python最小生成树kruskal与prim算法详解 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python3调用百度AI识别图片中的文字功能示例【测试可用】

    我会详细讲解如何实现Python3调用百度AI识别图片中的文字功能。以下是完整攻略: 环境搭建 首先,要使用百度AI的文字识别功能,需要先进行环境搭建,搭建方式如下: 首先,你需要在百度AI控制台上创建一个新应用,获取到该应用的App ID、API Key和Secret Key; 安装百度AI Python SDK,可以通过 pip 命令安装: bash p…

    python 2023年5月18日
    00
  • Python中删除文件的程序代码

    删除文件的程序代码在Python中非常简单,只需要使用内置的os模块中的函数即可。下面是几个删除文件的示例代码和相应的说明。 示例1:一次删除一个文件 若想删除一个文件,只需在代码中调用os库中的 remove() 函数并传入文件的路径作为参数即可。 import os # 指定要删除的文件路径 file_path = "example.txt&q…

    python 2023年6月5日
    00
  • python格式化输出%s与format()的用法对比

    下面详细讲解一下“python格式化输出%s与format()的用法对比。” 1. %s格式化输出 %s是一种Python中常用的字符串格式化输出方法,它可以对字符串、数字、列表、字典等变量进行格式化输出。 下面是使用%s进行字符串和数字的格式化输出的示例代码: name = "Tom" age = 20 print("My n…

    python 2023年6月5日
    00
  • cmd运行python文件时对结果进行保存的方法

    当我们使用cmd运行Python文件时,有时候需要将运行结果保存到文件中,以便后续查看或进行分析。下面是Python在cmd中保存结果的方法。 方法一:使用输出重定向符号 在cmd运行Python程序时,可以使用输出重定向符号>将运行结果保存到指定文件中。具体操作如下: 在cmd中进入Python文件所在目录; 输入命令python filename.…

    python 2023年5月20日
    00
  • pytest多进程或多线程执行测试实例

    下面是关于pytest多进程或多线程执行测试实例的完整攻略。 什么是pytest? pytest是Python的一个单元测试框架,是Python标准库中unittest的一个替代方案。 pytest多进程或多线程执行测试实例有什么优劣? pytest支持多进程或多线程执行测试实例,这样可以有效提高测试效率,提升测试覆盖率,但也有一定的缺点,例如可能会带来一些…

    python 2023年5月19日
    00
  • 教你用 Python 发送告警通知到微信的操作过程

    在Python中,我们可以使用企业微信提供的API来发送告警通知到微信。下面是Python发送告警通知到微信的操作过程: 1. 获取企业微信的API密钥 在使用企业微信API发送消息之前,我们需要先获取企业微信的API密钥。我们可以在企业微信管理后台中创建一个应用,并获取应用的corpid、corpsecret和agentid。这些信息将用于后续的API调用…

    python 2023年5月14日
    00
  • Python实现复制文档数据

    Python实现复制文档数据 在Python中,我们可以使用多种方法来复制文档数据。本文将介绍两种常用的方法,并提供两个示例。 方法一:使用shutil库复制文件 shutil库是Python标准库之一,提供了许多文件和目录操作的函数。我们可以使用shutil库中的copy()函数来复制文件。 以下是使用shutil库复制文件的示例: import shut…

    python 2023年5月15日
    00
  • python中json操作之json.loads、json.load、json.jumps及json.jump用法

    当我们在Python中进行JSON数据操作时,我们可以使用json模块中提供的几种函数。在本文中,我将介绍JSON数据在Python中的三种常见操作,分别是json.loads、json.load、json.dumps以及json.dump。 1. json.loads json.loads方法可以将JSON格式的字符串解析成Python字典对象。该方法的语…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部