前提介绍:最小生成树概念

  一个连通图的生成树是图的极小连通子图,它包含图中的所有定点,并且只含尽可能少的边,这意味着对于生成树来说,就砍去使生成树变成非连通图;若给它怎家一条边就会形成图中的一条回路。

  对于一个带权连通无向图G=(V,E),生成树不同,每个树的权也可能不同。设W为G的所有生成树的集合,若T为G中边的权值之和最小的那棵生成树,则T成为G的最小生成树。

Prim算法概念

  Prim算法的执行非常类似于寻找图的最短路径的Dijkstra算法。假设N={V,E}是连通网,Et是N上最小生成树中边的集合。算法从Vt={u0}(u0∈V),Et={}开始,重复执行下述操作:在所有u∈Vt,v∈V-Vt的边(u,v)∈E中找一条代价最小的边(u0,v0)并加入集合Et,同时将v0并入Vt,直到Vt=V为止。此时Et中必有n-1条边,则T={Vt,Et}为N的最小生成树。

  Prim算分的步骤如下:

  初始化:向空树T=(Vt,Et)中添加图G=(V,E)的任一定点u0,使Vt={u0},Et=空集;

  循环下述操作:从图G中选择满足{(u,v)|u∈Vt,v∈V-Vt}且具有最小权值的边(u,v),并置Vt=Vt∪{v},Et=Et∪{(u,v)}。

实例及解析



  第一步:

从图中选择一条最短的边加入集合,不难看出,1是此时最短的边。

第二步:



此时我们可以从V1,V2两个顶点出发,寻找下一个定点与这两个顶点之一相连,并且能使相连的這条边是最短的,所以我们下一个选择的是V6,此时顶点集合有:V1,V3,V6。

第三步:



从V1,V3,V6三个顶点出发,我们要寻找下一条最短的边,不难发现,此时2是最短的那一条边,连接V6,V4,所以把它加入边的集合(要注意,加入的边不能使生成树带有回路!),此时顶点集合:v1,v3,v4,v6

第四步:



从V1,V3,V6,V4四个顶点出发,寻找下一条最短的边并且不能使生成树带有回路,此时可以发现,V3到V2的5是最短的这条边。

第五步:



最后一步,从V1,V2,V3,V6,V4的顶点出发,寻找吓下一条最短的边,并且不能形成回路,很明显V2到V5这条边最短,加入之后最小生成树已经形成。

伪代码实现

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

算法的复杂度

  Prim算法的时间复杂度为O(|V|²),不依赖于|E|,因此它很适合于求解边稠密的图的最小生成树,虽然采用其他办法可以改进Prim算法的时间复杂度,但增加了实现的复杂性。

[数据结构]普里姆(Prim)算法生成最小生成树的更多相关文章

  1. 图的普里姆(Prim)算法求最小生成树

    关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...

  2. 普里姆Prim算法介绍

    普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T ...

  3. 图解最小生成树 - 普里姆(Prim)算法

    我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...

  4. JS实现最小生成树之普里姆(Prim)算法

    最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...

  5. 普里姆(Prim)算法

    /* 普里姆算法的主要思想: 利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录 */ # include <stdio.h> typedef char Ve ...

  6. 图论---最小生成树----普利姆(Prim)算法

    普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...

  7. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  8. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  9. 数据结构之---C语言实现最小生成树之prim(普里姆)算法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  10. 经典问题----最小生成树(prim普里姆贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

随机推荐

  1. 云计算_OpenStack

    部署方式-Fuel 注:部署失败且Fuel方式已过时. 部署方式-packstack 注:基于系统版本CentOS 7.9 2009部署 系统基本设置 设置静态IP=192.168.80.60 设置h ...

  2. Netty学习记录-入门篇

    你如果,缓缓把手举起来,举到顶,再突然张开五指,那恭喜你,你刚刚给自己放了个烟花. 模块介绍 netty-bio: 阻塞型网络通信demo. netty-nio: 引入channel(通道).buff ...

  3. 题解 P2080 增进感情

    \(\sf Link\) 爆搜最香了. 感觉有点像01背包(? 对于每件事,我们可以选择干或者不干,如果干就将好感值处理一下,当所有的事都搜完之后,记录最小值\(minn\) . 最终答案就是\(mi ...

  4. raid 5搭建部署

    raid 5搭建部署 软raid与备份 1.用四块磁盘做实验,三块盘搭建raid阵列组,有一块当作备份可以使用raid 5来搭建三块磁盘的阵列组 创建命令如下: [root@xiaohaoge ~]# ...

  5. Python--网络编程学习笔记系列01 附实战:udp聊天器

    Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑  网络号+主机号(按网络号和主机号占位分类A ...

  6. Python基础指面向对象:2、动静态方法

    面向对象 一.动静态方法 在类中定义的函数有多种特性 1.直接在类中定义函数 ​ 再类中直接定义函数,默认绑定给对象,类调用时有几个参数就要传几个参数,对象调用时该函数的第一个参数默认为对象 # 定义 ...

  7. 用 VS Code 搞 Qt6:让信号和槽自动建立连接

    Qt 具备让某个对象的信号与符合要求的槽函数自动建立连接.弄起来也很简单,只要调用这个静态方法即可: QMetaObject::connectSlotsByName(...); connectSlot ...

  8. 本人常用的sed命令用法

    如果使用sed命令修改文件,需要为sed命令指定[-i]选项(i,insert表示插入指令),下面是本人常用到的几种场景: 1. 在文件最后一行的下一行添加配置 如:在配置文件/etc/profile ...

  9. 使用@Transactional注解的方法所在的类获取不到注解的解决方案

    前段时间遇到一个问题,一个service叫做A吧,有多个实现类分别是B,C,D,需要根据前端传的不同参数去匹配不同的实现类,我就自定义了一个注解@OrderDeal放在B,C,D上面,然后匹配前端传的 ...

  10. Go语言核心36讲27

    在前面的文章中,我们一起学习了Go程序测试的基础知识和基本测试手法.这主要包括了Go程序测试的基本规则和主要流程.testing.T类型和testing.B类型的常用方法.go test命令的基本使用 ...