ds图—最小生成树_图与网络 (一)

01 基本概念

对于平面上 n 个点,将其中一些点对用边连接起来,形成的关系结构就是一个图。记作 G=(V,E)V 为顶点集,E 为边集。

每条边都具有方向的图称为有向图,都不具有方向的图称为无向图,否则称为混合图。

3  任何两个顶点之间最多只有一条边的图称为简单图。

如果图中两个顶点有边相连,则这两个顶点相邻,而每一对顶点都相邻的图称为完全图,记作K|v|

V=X∪Y,X∩Y=Ø,X≠Ø,Y≠Ø,X、Y 中均无相邻的顶点对,则称图 G 为二分图。特别地,若对于任意 u∈XuY 中每个顶点相邻,则 G 为完全二分图,记作 K|x|,|y|

假设点 v∈V 是边 e∈E 的端点,则称 ve 相关联。与某一点关联的边的数目记作该顶点的度,记作 d(v),度数为奇数的顶点叫做奇顶点,否则为偶顶点。可以证明所有顶点度之和为边数的两倍,所以奇顶点的总个数必然是偶数。

 如果两个顶点存在路线使其连通,则称两顶点关联,这些路线称为道路。起点和终点重合的道路称为回路。所有道路中, 各边不同的道路称为迹,各顶点不同的道路称为轨道,记作 P 。对于 P,起点与终点重合时称为圈;含有所有顶点的轨道称为 Hamilton 轨道,闭合的 Hamilton 轨道称为 Hamilton 圈,含有 Hamilton 圈的图称为 Hamilton 图。

图中任意两顶点之间存在道路的图称为连通图。

 两顶点间最短的轨道的长度称为这两个顶点的距离。

9  每一条边都有一个或多个实数与之对应的图为赋权图,这些是实数称为权。例如之前提过的TSP问题中的适应度。

02 数据结构

计算机中描述、存储图与网络主要用邻接矩阵表示法。

对于具有 n 个顶点的图 G,他的邻接矩阵 A 是 n 阶方阵。矩阵元素表示顶点之间的关系。

对于无向图

05c7aff7c72821cf3751c98124511088.png

对于有向图

70e57e6b89bc690bca3c3031402c727f.png

对于带权无向图

b5c2ea767d68a5b8a7c689de829438dc.png

对于带权有向图

1a464a67bc53da54cebe7db438b2b617.png

为了更加方便地表示,可以用将邻接矩阵转化为稀疏矩阵。

MATLAB中将矩阵转化为稀疏矩阵的命令是 sparse,将稀疏矩阵变为普通矩阵的是 full

可以看出,对于无向图,邻接矩阵有对称的形式。稀疏矩阵仅包含邻接矩阵下三角元素中的非零项。

03 最短路径问题

 两个指定顶点之间的最短路径

例如:如下图,某公司在全球有六个分公司,现在要设计航班路线,使得从总部去往其他一个分部花费的票价最少。其中有航班往返的用黑线标出。

10d727cfd22521f6ef15fe8d01e96066.png

自上而下、从左向右将七个城市顺序编号。机票价格如下(单位 k rmb)

67aba18881dfc371c62de77bfc084d02.png 对于这类单源最短路径问题,可选择 Dijkstra 算法求解。 Dijkstra 算法的思想 简单来说就是 :从起点开始,按照从近到远的顺序依次不断更新到 其他 各个顶点之间的最短路径和距离,直到抵达终点。 具体操作是: 1   将点集 V 分为 SU 两个子集。其中 S 包含起点 vU=V-S  从 U 中取距离最小的顶点 u ,将其从 U 移入 S 以 u 为中间点,比较修改 U 中各顶点 j 的最短路径, 即选取  d=min(d+d,d)  重复前两步骤,直到终点进入 S

MATLAB 实现该算法如下,解得右边结果。

ba37959daa776520a6b8464969e4b4d4.png /后台发送 'Dijkstra' 得源码/

此类问题也可以转化为0-1规划问题。决策变量 x1时表示两顶点取得最短路径。

9946d970bb64e8a0d6934577e125f0dd.png

 每对顶点之间的最短路径

显然,解决此类多源最短路径问题,可以通过设置不同起点,多次调用 Dijkstra 算法。

另一种方法是 Floyd 算法。

其基本思想是通过递推产生一个矩阵序列 {Ak (k=1,2,…,n)},它的第 i 行第 j 列元素表示顶点 vi 到顶点 vj 路径上经过的顶点序号不大于 k 的最短路径长度。

迭代公式如下:

7dcc6b30a10bc0c9c09fe9fbccffd8e5.png

k=n 时,矩阵  An  即是各个顶点之间的最短路径长度。MATLAB实现 Floyd 算法以及求解上例如下: 093e7ca51827ff2a3b3449600cbae225.png /后台发送 'Floyd' 得源码/

04 最小生成树问题

首先补充一下需要用到的关于树的一些概念。 对于一棵树 T={D,R} D 是包含 n 个结点的有限集合。 n=0 时, T 为空树。 对于非空树,关系集合   R 满足

 有且仅有一个结点 d0∈D,它对于关系 R 来说,没有前驱结点,该结点称为树的根结点。

 除了根结点外,每个结点有且仅有一个前驱结点。

 D 中每个结点可以有零个或多个后继结点。

 没有后继结点的结点叫做叶子结点。  关于树的高度、结点的度等概念和满足的性质,可以自行去了解~ 对于一个连通图,它的生成树由图中的全部顶点( n 个)和 n-1 条边构成。一个连通图的生成树不是唯一的。

44aca9dd79df6582169e6b068d87ce56.png

由定义可知,不能使用产生回路的边来构造生成树。而如果在一棵生成树上添加一条边,必定有回路产生,所有顶点都将关联。 最小生成树,定义为连通赋权图的权值之和最小的生成树。 构造最小生成树,常使用 Prim 算法和  Kruskal 算法。 某航空公司要在图中九个城市之间开通航班,已知在每两个城市之间开通航班的成本,请为公司设计路线图,使总成本最低。 24e6a8b0b9572210ea57d7100be8cafd.png 自上而下、从左向右将九个城市顺序编号。成本 如下(对称矩阵,省略了下三角) cec92f5d8b8d698e455aba6c2289cfeb.png

这就是一个典型的最小生成树问题,以下求解

 Prim 算法

Prim 算法是一种构造性算法,结合贪心算法,通过不断寻找局部最优加以调整,得到全局最优。

设集合 U 存储顶点,算法具体操作为:

 初始化 U={v}U 到所有其他顶点的边为候选边。

 从候选边中挑选与 U 中叶子结点相连且权值最小的边,将其终点 k 加入 U。同时将这条边从候选边中去除。

 重复上一步骤,直到所有顶点加入 U,即可得到最小生成树。

534da7d40db0d9fa5d7f0602f2b98a62.png /后台发送 'Prim' 得源码/

 Kruskal 算法

Kruskal 不断选取权值最小的边(但不能有回路),操作如下:

 初始选取 e1∈E(G)e1 是权值最小的边。

 依次从 E(G)-{e1,e2,…,ei-1} 中选取 ei (i=2,3,…,n-1),满足 {e1,e2,…,ei} 中无圈,并且 ei 是 E(G)-{e1,e2,…,ei-1} 中权值最小的边。

b3959f4411113525f23d0f91a145c74a.png /后台发送 'Kruskal' 得源码/ 两个算法的解相同。 a6227adc3374d29add8e1fc9988e78d5.png

刚好这学期在数据结构这门课有学一些树和图论的内容,写在这里正好也当做复预习。

图还可以经过拓展形成网络,关于这部分内容,就先搁着等搞一搞学业还有就是学一学 Lingo 这个软件之后再说。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
szuoj数据结构 ds中的最小生成树是指在一个无向加权连通中,找到一个生成树,使得该生成树的所有边的权值之和最小。 最小生成树论中的重要概念,用于解决各种实际问题,如最优路径规划、电网布线等。在szuoj数据结构 ds中,通过使用不同的算法来寻找最小生成树,例如普里姆算法和克鲁斯卡尔算法。 普里姆算法是一种从一个起始节点开始逐步添加新的节点到生成树中的算法。首先选择一个起始节点,然后将其加入生成树中。然后,选择与生成树中的节点相连的边中权值最小的边,将其所连接的节点加入生成树,重复以上步骤直到所有节点都加入生成树或无法再加入新的节点为止。 克鲁斯卡尔算法是一种基于边的贪心算法,它首先将所有边按权值从小到大排序,然后逐条检查边,如果边的两个顶点不在同一连通分量中,则将该边加入生成树,直到生成树中包含所有的节点或所有边都已检查完毕。 不论是普里姆算法还是克鲁斯卡尔算法,它们都能找到一个最小生成树。在szuoj数据结构 ds中,我们通过实现这两种算法来解决最小生成树的问题。这些算法的时间复杂度均为O(ElogV),其中E表示边的数量,V表示节点的数量。 通过学习和实践szuoj数据结构 ds中的最小生成树算法,我们可以更好地理解和应用论知识,提高解决实际问题的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值