首页 > 其他分享 >最小生成树

最小生成树

时间:2023-10-03 17:32:02浏览次数:17  
标签:连通 普里 最小 生成 算法 顶点

一个连通且无回路的无向图称为树。在树中度数为 1的节点为叶,度数大于1的节点称为分枝点或内节点。

给定图 T,以下关于树的定义是等价的。

(1)无回路的连通图。

(2)无回路且e=v-1,其中e为边数,v为节点数

(3)连通且e=v-1。

(4)无回路且增加一条新边,得到一个且仅一个回路

(5)连通且删去任何一个边后不连通。

(6)每一对节点之间有且仅有一条路。

在带权的图 G的所有生成树中,树权最小的那棵生成树称作最小生成树。

求连通的带权无向图的最小代价生成树的算法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。

1.普里姆算法

设已知 G=(V,E)是一个带权连通无向图,顶点 {0,1,2,··,n-1}。设U是构造生成树过程中已被考虑在生成树上的顶点的集合。初始时,U只包含一个出发顶点。设T是构造生成树过程中已被考虑在生成树上的边的集合,初始时 T为空。如果边(i,j)具有最小代价,且i∈U,j∈V-U,那么最小代价生成树应包含边(i,j)。把j加到U中,把(i,j)加到T中。重复上述过程,直到U等于为止。这时,T即为要求的最小代价生成树的边的集合。

普里姆算法的特点是当前形成的集合 T始终是一棵树。因为每次添加的边是使树中的权尽可能小,因此这是一种贪心的策略。普里姆算法的时间复杂度为 O(n2),与图中边数无关,所以适合于稠密图。

2.克鲁斯卡尔算法

设 T的初始状态只有 n个顶点而无边的森林 T=(V,ψ),按边长递增的顺序选择E中的 n-1 条安全边(u,v)加入 T,生成最小生成。所谓安全边,是指两个端点分别是森林T里两棵树中的顶点的边。加入安全边,可将森林中的两棵树连接成一棵更大的树,因为每一次添加到 T中的边均是当前权值最小的安全边,MST 性质也能保证最终的 7是一棵最小生成树。

克鲁斯卡尔算法的特点是当前形成的集合 T 除最后的结果外,始终是一个森林克鲁斯卡尔算法的时间复杂度为 O(elog2e),与图中顶点数无关,所以较适合于稀疏图。

例如,使用普里姆算法构造图18-1小成的过程如图18-2至18-6

标签:连通,普里,最小,生成,算法,顶点
From: https://blog.51cto.com/u_15590807/7694031

相关文章

  • 以下是一个比较复杂的R语言代码示例: ```R # 生成随机数 set.seed(123) data <- rnorm
    以下是一个比较复杂的R语言代码示例:#生成随机数set.seed(123)data<-rnorm(1000)#数据处理和分析data_mean<-mean(data)data_sd<-sd(data)data_median<-median(data)#创建一个绘图窗口par(mfrow=c(2,2))#绘制直方图hist(data,main="HistogramofDat......
  • 中兴交换机配置MC-LAG生成树配置注意事项
    spantree  enable  moderstp  bridge-addressxxxx.xxxx.xxxx #TOR1,TOR2配置一样,配置为TOR1的机架mac  mstpriority8192 instance0 #存管TOR1,存管TOR2配置一样,优先级配置为8192  tc-guardenable #开启对TC类型BPDU报文的保护功能  vstpenable#开启VSTP功能 ......
  • 最小生成树 Kruskal
    问题引入:有某无向图,其有n个点,m条边,每条边边权w已知,求能使图连通的最小代价。等价于:有一个联通图,它有n个点,把这个图去边,直到还剩n-1条边。如果现在这个图还是联通图,那么你就得到了一棵树,这棵树就是图的生成树,最小生成树就是一个图的所有生成树里这n-1条边的权值之和最小的。......
  • 判别模型和生成模型
    生成模型就像它的名字可以模拟训练数据的特征分布。判别模型只能根据输入变量x判断其类别。抽象一下都是p(Y|x) ......
  • 155. 最小栈
    设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素。输入:["......
  • C++特种成员函数生成机制及相关原则
    C++特种成员函数生成机制及相关原则注:默认C++标准是C++11及以后的标准,因为C++11之前的标准定义的默认成员函数不包含移动构造函数和移动赋值运算符1.C++默认成员函数默认成员函数的定义:类中没有显示声明,在需要时由编译器自动生成的函数,包括默认构造函数、默认析构函数、......
  • Leaf-美团的分布式ID生成器
    简介在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯......
  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果......
  • chat2db教程:根据对话内容生成SQL语句
    准备示例表--学生信息表droptableifexistsSTUDENT;CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'学生ID',nameVARCHAR(50)NOTNULLCOMMENT'学生姓名',genderVARCHAR(10)NOTNULLCOMMENT'学生性别',birthdayDATEN......
  • prim求最小生成树
    prim算法建议在kruskal算法及相关证明掌握后进行学习,这里不再赘述。前置知识暂无prim的算法步骤确定一号节点为最小生成树。找到一条由已经属于最小生成树的点集连到还不属于最小生成树的点集的边,使得这条边在这类边中权值最小。令已经属于最小生成树的点集为\(S\),还......