最小生成树 加权无向图

这篇博客介绍了最小生成树的概念,它是加权无向图的一种无环连通子图,权值最小。文章详细讲解了切分定理和贪心算法在求解最小生成树中的应用,以及如何在加权无向图中表示边和图。同时,讨论了Prim算法和Kruskal算法,并提供了加权无向图数据类型的API设计。
摘要由CSDN通过智能技术生成

最小生成树

加权图:为每条边关联一个权值或成本的图模型

本节我们将学习加权无向图模型并用算法求解最小生成树问题。

最小生成树(MST):给定一幅加权无向图,找到它的一棵最小生成树。图的生成树是它的一棵含有其所有顶点无环连通子图。一幅加权无向图的最小生成树是它的一棵权值(树中所有边的权值之和)最小的生成树。


计算最小生成树的两种经典算法:Prim算法Kruskal算法

在计算最小生成树的过程中可能出现各种特殊情况。我们约定如下:只考虑连通图;边的权重可能是0或负数;所有边的权重都各不相同


原理

切分定理

图的一种切分是将图的所有顶点分为两个非空且不重复的两个集合。横切边是一条连接两个属于不同集合的顶点的边。
在这里插入图片描述
根据切分定理,我们把加权图中的所有顶点分为两个集合、检查横跨两个集合的所有边并识别哪条边应属于图的最小生成树。

在假设所有的边的权重均不相同的前提下,每幅连通图都只有一棵唯一的最小生成树。切分定理也表明了对于每一种切分,权重最小的横切边必然属于最小生成树。


贪心算法

切分定理是解决最小生成树问题的所有算法的基础。
更准确的说,这些算法都是一种贪心算法的特殊情况:使用切分定理找到最小生成树的一条边,不断重复直到找到最小生成树的所有边。
这些算法相互之间的不同之处在于保存切分和判定权重最小的横切边的方式,但他们都是以下命题的特殊情况:
在这里插入图片描述

下图展示了这个贪心算法运行的典型轨迹。每一幅图表现的都是一次切分,其中算法识别了一条权重最小的横切边(加粗)并将它加入最小生成树之中。
在这里插入图片描述


加权无向图

加权无向图应该如何表示?最简单的方法就是扩展无向图的表示方法
邻接矩阵的表示中,可以用边的权重代替布尔值作为矩阵的元素
邻接表的表示中,可以在链表的结点中增加一个权重域


加权无向边的数据类型

另外一种表示方式,用更加通用的API来处理Edge对象:
在这里插入图片描述

该数据结构 提供了either() 和 other(v) 两个方法。
当已知一个顶点v时,用例可以使用 other(v) 来得到边的另一个顶点。
当两个顶点都是未知时,用例可以使用惯用代码 v = e.either(),w = e.other(v) 来访问一个Edge对象e的两个顶点。

Edge类必须实现 Comparable接口 并包含一个 compareTo() 方法。

/*
 * 带权重的边的数据类型
 */
public class Edge implements Comparable<Edge>{
   
    private final int v;          //顶点之一
    private final int w;          //另一个顶点
    private final double weight;  //权重
    
    public Edge(int v, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值