Python之最小生成树 kruskal

简介: Python之最小生成树 kruskal

蓝桥杯填空压轴考察了最小生成树 因此本文围绕算法kruskal解决最小生成树问题

适合小白阅读(会比较枯燥)


试题E:

image.png


抛开最小生成树,阅读完题目,我们知道,每两座城堡都有一座桥连接。


因此一共有C(2021,2)座桥来连接。(组合数)


下面来掌握一个定义:(下面表述以顶点代替城堡,边代替桥)


连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。

对边加入了权值的连通图,叫连通网

那么对于2021个顶点,要保证所有顶点连通(比如有顶点A,B,如果A可以从C再到B,从D到E再到B等等,只要能通过一种路径到B,就称A和B有路径连通,并不是只有A直接到B这样),至少需要多少个边?答案是n-1条


数学归纳法证明:n=1 成立 假设n=k时,命题成立,即有k个顶点的连通图至少具有k-1条边,下面只需证k+1个顶点的连通图至少有k条边:


对于k个顶点和那一个孤立的第k+1个点,k个顶点之中任取一点,必然可以和那个孤立的点连接,此时有k+1条边,下面只需证明现在这个加入这条边后的图是连通图:由于k个顶点组成的图是连通图,说明k中任意两点都有路径相同,因此只需证明那个孤立的点与k个顶点都有路径相通,由于那个孤立的点与之前取的顶点直接相连,孤立的点必定可以访问余下的k-1个顶点。所以证明成立


所以题目说对于2021个顶点,取(所谓的装饰)2020条边就可以保证连通,是合理的。


现在在谈最小生成树,那要先知道生成树定义:对于有n个顶点的连通图,只有n-1条边的连通子图就是它的生成树。(既然是树就不可能存在环)


所以简言之,生成树就是以最少的边(n-1)条边来连接所有顶点的图。但是:


image.png


生成树不唯一(取的边的组合不唯一),当我们赋予了边的权值时,所有边的权值的和也就必然有一个最小值。即最小生成树


前面提到,一共有C(2021,2)条边,我们要做的就是取2020条边,保证顶点连通的同时确保边权值和最小。而kruskal算法就保证了以上两点要求:连通性,最小权值和。


https://www.bilibili.com/video/BV1PW411877b

https://www.bilibili.com/video/BV1PW411877b

建议去看一下这个视频,有助于理解。


kruskal的主要内容是并查集和贪心,对此不熟悉的同学可以先去洛谷做一下亲戚那道题

传送门

https://www.luogu.com.cn/problem/P1551


配套相应的视频花一个下午的时间即可掌握并查集。


下面阐述kruskal的基本算法思想,创建边的数组(i,j,weihgt),按照边的权值排序(贪心),然后,初始化各个顶点作为一个独立的集合(并查集思想),遍历边(贪心),如果i和j不在同一集合,意味着i,j不连通(并查集),对应的边应当取过来,权值和累加一次,否则如果i和j在同一集合(已经连通),意味着这条边不应取过来...直至取完n-1条边,只剩下一个集合,这个集合包含所有点(连通性)那么最终的权值和一定是最小的(最小权值和)。

如果想知道数学证明的可以点这里,也可以和小郑一样暂时把这个记下来~

https://zhuanlan.zhihu.com/p/340628568


#连通网:最小生成树
#定义获取两城邦权值函数
parent=[i for i in range(0,2022)]#初始化祖先
def find_root(x):#查找集合[路径压缩]
    if x!=parent[x]:
        parent[x]=find_root(parent[x])
    return parent[x]
def union(x,y):#合并集合
    x_root,y_root=find_root(x),find_root(y)
    if x_root!=y_root:
        parent[x_root]=y_root
def get_weight(x,y):#获取权值
    a='0'*(4-len(str(x)))+str(x)
    b='0'*(4-len(str(y)))+str(y)
    s=0
    for i in range(4):
        if a[i]!=b[i]:
            s+=int(a[i])+int(b[i])
    return s
edge=[]#创建边集(i,j,weight)
for i in range(1,2022):
    for j in range(1,2022):
        edge.append((i,j,get_weight(i,j)))
edge.sort(key=lambda x:x[2])#关键字排序
count=0
j=1
for i in edge:
    try:
        if find_root(i[0])!=find_root(i[1]) and j<=2020:#不处在同一连通分量(集合)且点数未达到2021-1
            count+=i[2]#累加
            union(i[0],i[1])#合并
            j+=1
    except:#检查报错点
        print(i[0],i[1])
        break
print(count)#答案是4046


     


我是小郑 正在奔赴热爱奔赴山海


目录
相关文章
|
算法 Python
Python之最小生成树 kruskal
Python之最小生成树 kruskal
133 0
Python之最小生成树 kruskal
|
25天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
24天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
12天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
101 80
|
1月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
144 59
|
1天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
25 14
|
11天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
45 2
|
24天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
45 10
|
28天前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
26天前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
44 12