【开卷数据结构 】图的应用——最短生成树

这篇具有很好参考价值的文章主要介绍了【开卷数据结构 】图的应用——最短生成树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

最小生成树

Prim算法实现最小生成树

kruskal算法实现最小生成树


【开卷数据结构 】图的应用——最短生成树

最小生成树

Q:什么是广度优先搜索

A:一个连通图的生成树含有图中全部的顶点,并且只含尽可能少的边。若砍去它的一条边,则会使生成树变成非连通图。若给它增加一条边,则会形成图中的一条回路。

对于一个带权连通无向图 G=(V, E) ,生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同,其中边的权值之和最小的那棵生成树(构造连通网的最小代价生成树),称为G的最小生成树。

通过定义不难看出,最小生成树具有以下性质:

  • 1)最小生成树不是唯一的,即最小生成树的树形不唯一,所有生成树中可能有多个最小生成树。当图 G 中的各边权值互不相等时,G 的最小生成树是唯一的。 若无向连通图 G 的边数比顶点数少1,即 G 本身是一棵树时,则 G 的最小生成树就是它本身。
  • 2)最小生成树的边的权值之和总是唯一的,虽然最小生成树不唯一,但其对应的边的权值之和总是唯一的,而且是最小的。
  • 3)最小生成树的边数为顶点数减1。

构造最小生成树 有多种算法,但大多数算法都利用了最小生成树的下列性质:假设  G=(V,E) 是一个带权连通无向图,U 是顶点集 V 的一个非空子集。若 (u,v) 是一条具有最小权值的边,其中  u∈U,v∈V−U , 则必存在一棵包含边 (u,v) 的最小生成树。

下面介绍一个通用的最小生成树算法:

GENERIC_MST(G){
	T=NULL;
	while T 未形成一棵生成树;
		do 找到一条最小代价边(u, v)并且加入T后不会产生回路;
			T=T ∪ (u, v);
}

通用算法每次加入一条边以逐渐形成一棵生成树,下面介绍两种实现上述通用算法的途径。

【开卷数据结构 】图的应用——最短生成树

Prim算法实现最小生成树

Q:如何通过Prim算法构建最小生成树

A:初始时从图中任取一顶点加入树 T,此时树中只含有一个顶点。之后选择一个与当前 T 中顶点集合距离最近的顶点,并将该顶点和相应的边加入 T。每次操作后 T 中的顶点数和边数都增 1。以此类推,直至图中所有的顶点都并入 T,得到的 T 就是最小生成树。此时 T 中必然有 n-1条边。

通俗来讲,Prim算法构建最小生成树流程如下:

  • 1) 从某顶点 u0 出发,选择与它关联的具有最小权值的边 (u0, v),将其顶点 v 加入到生成树的顶点集合 U 中。
  • 2) 每一步从一个顶点在 U 中,而另一个顶点不在 U 中的各条边中选择权值最小的边 (u, v),把它的顶点 v 加入到 U 中。
  • 3)直到所有顶点都加入到生成树顶点集合 U 中为止。

Prim算法的简单实现如下:

void Prim(G,T)
{
	t=NULL;				//初始化空树 
	U={w};				//添加任一结点 w
	while((V-U)!=NULL)	//若树中不含全部结点
	{
		设(u,v)是使 u∈U与v∈(V-U),且权值最小的边;
		T=T∪{{u,v}}	//边归入树 
		U=U∪{v};		//顶点归入树 
	} 
}

Prim 算法的时间复杂度为 O(n^2),不依赖于|E|,因此它适用于求解边稠密的图的最小生成树。

【开卷数据结构 】图的应用——最短生成树

kruskal算法实现最小生成树

与 Prim 算法从顶点开始扩展最小生成树不同,Kruskal 算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。

Q:如何通过kruskal算法构建最小生成树

A:初始时为只有 n 个顶点而无边的非连通图 T=V,每个顶点自成一个连通分量,然后按照边的权值由小到大的顺序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在 T 中不同的连通分量上,则将此边加入 T,否则舍弃此边而选择下一条权值最小的边。以此类推,直至 T 中所有顶点都在一个连通分量上。

通俗来讲,kruskal算法构建最小生成树流程如下:

  • 1)设连通网络 N = { V, E },构造一个只有 n 个顶点,没有边的非连通图 T = { V, Ø }, 每个顶点自成一个连通分量。
  • 2) 在 E 中选最小权值的边,若该边的两个顶点落在不同的连通分量上,则加入 T 中;否则舍去,重新选择。
  • 3)重复下去,直到所有顶点在同一连通分量上为止。

kruskal算法的简单实现如下::

void Kruskal(V,T)
{
	T=V;				//初始化树T,仅含顶点
	numS=n				//连通分量数
	while(numS>1){		//若连通分量数大于 1 
		从 E 中取出权值最小的边(v,u); 
		T=T ∪{{v,u}};	//将此边加入生成树中 
		numS--; 		//连通分量减 1 
	} 
}

kruskal 算法的时间复杂度为 O(ElogE) ,因此它适用于求解边稀疏而顶点多的图的最小生成树。文章来源地址https://www.toymoban.com/news/detail-406870.html

到了这里,关于【开卷数据结构 】图的应用——最短生成树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】图的搜索——广度优先遍历、最小生成树

    邻接链表: 用字典实现.有向图的邻接链表的总长度等于图的边个数;无向图的邻接链表的总长度等于图的边个数的2倍. 邻接矩阵:用于最短路径算法. 该数据结构维护一个不相交动态集的集合,每个集合有一个代表,不关心谁做代表。 支持三种操作: MAKE_SET(x) FIND_SET(x) UNION(x,y

    2024年02月19日
    浏览(49)
  • 【数据结构(30)】6.6 图的应用

    其中: 拓扑排序 以及 关键路径 针对的是一种特殊的图,称作 有向无环图 。 生成树 图中所有顶点均由边连接在一起,但是 不存在回路 的图。 包含无向图 G 所有顶点的 极小连通子图 。 极小连通子图 : 顶点的边数目在这个连通子图中的数目已经达到最小。 如果在该图中

    2024年02月01日
    浏览(40)
  • 【数据结构】无向图的最小生成树(Prime,Kruskal算法)

    连通图 :在 无向图 中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。如果图中 任意一对顶点都是连通的 ,则称此图为连通图 强连通图 :在 有向图 中,若在每一对顶点vi和vj之间都存在一条从vi到vj的路径,也存在一条从vj到vi的路径,则称此图是强连通图 生成

    2024年01月24日
    浏览(48)
  • 【开卷数据结构 】二叉排序树(BST)

    目录 二叉排序树(BST) 二叉排序树的定义 二叉排序树的操作 二叉排序树的查找 代码演示 二叉排序树的插入 代码演示 二叉排序树的构造 代码演示 二叉排序树的删除 Q:什么是二叉排序树 A: 二叉排序树或者是一棵空树,或者是具有如下性质的二叉树 1) 若它的左子树不空

    2024年02月11日
    浏览(41)
  • 数据结构:地图着色问题——图的应用——回溯法

    目录 前言 一、解决问题的思路 二、存储结构设计 三、代码 1.创建图函数 2.判断色号是否相同函数 3.回溯函数 4.整体代码 总结 本次解决的问题:用图模拟部分地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。 先来一张效果图 将邻接矩阵

    2024年02月04日
    浏览(54)
  • 数据结构第三遍补充(图的应用)

    Kruskal算法实现的关键是:当一条边加入到TE的集合后,如何判断是否构成回路? 答: 简单的解决方法是:定义一个一维数组Vset[n]; 存放图T中每个顶点所在的连通分量的编号。 ① 初值: Vset[i]=i, 表示每个顶点各自组成一个连通分量,连通分量的编号简单地使用顶点在图中的位置

    2024年02月06日
    浏览(47)
  • 数据结构专题实验7——图的应用(景点管理)(C++实现)

    实验内容:应用图的技术,根据需求文件要求的功能,实现旅游景点的管理。实验要求: 使用图的数据结构建立一个景点图的结构。 可以查找各景点信息。 旅游景点导航,使用深度优先,从一个景点开始遍历所有景点。 查找一个景点到另一个景点的最短路径。 对景点道路

    2024年02月04日
    浏览(48)
  • 数据结构-图的遍历和应用(DAG、AOV、AOE网)

    目录 *一、广度优先遍历(BFS) 广度优先生成树 广度优先生成森林 *二、深度优先遍历 深度优先生成树 深度优先生成森林 二、应用 2.1最小生成树 *Prim算法 *Kruskal算法 2.2最短路径  *BFS算法 *Dijkstra算法  *Floyd算法 *2.3有向无环图(DAG网)  *2.4拓扑排序(AOV网) *逆拓扑排序  *2.5关键路

    2024年02月10日
    浏览(42)
  • 数据结构第11周 :(图的遍历及连通性 + 犯罪团伙 + 图形窗口问题 + 最小生成树的权值之和 + Jungle Roads )

    【问题描述】 根据输入的图的邻接矩阵A,判断此图的连通分量的个数。请使用邻接矩阵的存储结构创建图的存储,并采用BFS优先遍历算法实现,否则不得分。 【输入形式】 第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接

    2024年02月06日
    浏览(45)
  • 408【数据结构】图、生成树、图的出度和入度、路径and路径长度和回路、简单路径和简单回路概念整理 和 错题整理

            图由顶点集V和边集E组成,记为G=(V,E),使用 V(G) 表示 所有顶点的集合(不能为空) ;使用 E(G) 表示 各个顶点之间的关系(可以为空) 。若用V={v1,v2,v3,....,vn}来表示图,则使用 |V|表示图中顶点的个数, 使用E={(vi,vj)|vi∈V,vj∈V},用 |E| 表示图中 边的条

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包