prim算法--最小生成树

悠悠 2021-11-17 02:28 575阅读 0赞

首先我们在这里先介绍一下prim算法,我记得大学数据结构先讲完最小生成树,再讲最短路径,也是考研必考问题。

prim算法在加权连通图里面寻找全局最小的生成树。是一个贪心算法。

下面两张图是我盗的哦。嘻嘻嘻

1710133-20190609092927979-1139590534.png

算法:

1、输入:一个加权连通图,顶点为V的集合,边为E的集合。

将输入表示为一个二维矩阵(备注:没有连通的边的长度设为MAX):如下

  1. import sys
  2. MAX = sys.maxsize # 设置无穷大

则矩阵表示为:

  1. primgraph =
  2. [[MAX, 6, 1, 5, MAX, MAX],
  3. [6, MAX, 5, MAX, 3, MAX],
  4. [1, 5, MAX, 5, 6, 4],
  5. [5, MAX, 5, MAX, MAX,2],
  6. [MAX, 3, 6, MAX, MAX, 6],
  7. [MAX, MAX, 4, 2, 6, MAX]]
  8. chararray = ['A', 'B', 'C', 'D', 'E', 'F']

初始化值:最小生成树总代价—lowcost,开辟一个数组存放最小生成树的节点

  1. charlist.append(chararray[0]) # 存放第一个初始结点
  2. lowcost = []
  3. lowcost.append(-1) #存放的第一个节点置为0
  4. sum为最小生成树的总权重

将除初始化A点的其他剩余加入lowcost初始化

  1. for i in range(1, n):
  2. lowcost.append(primgraph[0][i])

开始在胜利的边缘试探

开始一次遍历

  1. for _ in range(1, n): # 遍历除A点之外的其他节点
  2. min = MAX # 每次找到最小的边,min用来比较
  3. minid = 0 # 每次minid用来存放最小节点的索引
  4. for j in range(1, n): # 寻找最小权重的结点,并且!=-1代表未被皇上宠幸
  5. if lowcost[j] != -1 and lowcost[j] < min:
  6. min = lowcost[j]
  7. minid = j
  8. charlist.append(chararray[minid]) # 最小生成树加入最短路径的那个节点
  9. sum = sum+min # 总权重加上剩余节点中的最短的权重
  10. lowcost[minid] = -1 # 则最短路径的节点刚刚被宠幸,成为过去式
  11. for j in range(1, n): # 则更新宠幸名单 ,最最关键的部分!!!!
  12. if lowcost[j] != -1 and lowcost[j] > primgraph[minid][j]:
  13. #所有已经宠幸的节点,从已经宠幸的节点出发找到最短的路径,进行更新
  14. lowcost[j] = primgraph[mini

转载于:https://www.cnblogs.com/Victoria-happy/p/10992666.html

发表评论

表情:
评论列表 (有 0 条评论,575人围观)

还没有评论,来说两句吧...

相关阅读

    相关 生成prim算法

     边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。    最小生成树(MST):权值最小的生成树。    生成树和最小生成

    相关 生成-Prim算法

    最小生成树的目的是使一个图的节点到其他各个节点的距离最短。产生的树成为最小生成树。 最小生成树算法分为普利姆(Prim)算法与克鲁斯卡尔(Kruskal)算法来解决。

    相关 prim算法--生成

    首先我们在这里先介绍一下prim算法,我记得大学数据结构先讲完最小生成树,再讲最短路径,也是考研必考问题。 prim算法在加权连通图里面寻找全局最小的生成树。是一个贪心算法。