数据结构中图结构的最小生成树算法(普里姆算法)

数据结构中图结构的最小生成树算法(普里姆算法)
 最近有很久都没有露头了,主要是有很多的作业,而且马上就到了期末考试了,所以我没有什么时间来这里发布文章了。今天呢,把我以前写的图结构再次搬了上来。这次的图结构添加了广度优先遍历,和最小生成树的普里姆算法。现在我就把我程序中的普里姆算法贴出来,供大家参考。

Code:
  1. /*----------------------------------------------------------------------------  
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com  
  3. ------------------------------------------------------------------------------  
  4. 文件名:JGraph_MiniSpanTree.h  
  5. ------------------------------------------------------------------------------  
  6. 作用:最小生成树的生成  
  7. ------------------------------------------------------------------------------  
  8. 调用规范:无  
  9. /*--------------------------------------------------------------------------*/  
  10. // 条件编译   
  11. #ifndef _JGRAPH_MINISPANTREE_H_   
  12. #define _JGRAPH_MINISPANTREE_H_   
  13. /*--------------------------------------------------------------------------*/  
  14. // 返回顶点在图中的位置   
  15. template <typename CustomType>   
  16. int JMatrixGraph<CustomType>::LocateVex( CustomType u )   
  17. {   
  18.  int i;   
  19.  for ( i = 0; i < vexnum; i++ )   
  20.  {   
  21.   if ( vexs[i] == u )   
  22.    return i;   
  23.  }   
  24.  return -1;   
  25. }   
  26. /*--------------------------------------------------------------------------*/  
  27. // 输出最小边的下标   
  28. template <typename CustomType>   
  29. int JMatrixGraph<CustomType>::minimum( CloseEdge<CustomType>* closedge )   
  30. {   
  31.  int i, track_i = -1;   
  32.  VRType lowestcost = INFINITY;   
  33.  for ( i = 0; i < vexnum; i++ )   
  34.  {   
  35.   if ( lowestcost > closedge[i].lowcost && closedge[i].lowcost > 0 )   
  36.   {   
  37.    lowestcost = closedge[i].lowcost;   
  38.    track_i = i;   
  39.   }   
  40.  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
普里算法是一种用于构建最小生成的贪心算法。它从一个源节点开始,逐步扩展生成,直到覆盖所有节点。具体步骤如下: 1. 选择一个起始节点,并将其加入生成。 2. 找到与生成相邻的所有边,并选择其权重最小的边所连接的节点。 3. 将该节点加入生成,并将该边加入生成的边集。 4. 重复步骤2和3,直到生成包含所有节点。 下面是一个使用Python实现普里算法的例子: ```python def prim(graph): # 选择一个起始节点 start_node = list(graph.keys())[0] # 初始化生成和已访问节点集合 visited = set([start_node]) mst = [] # 当已访问节点集合不包含所有节点时 while len(visited) < len(graph): # 找到与生成相邻的所有边 edges = [] for node in visited: for neighbor, weight in graph[node].items(): if neighbor not in visited: edges.append((node, neighbor, weight)) # 选择权重最小的边所连接的节点 min_edge = min(edges, key=lambda x: x[2]) # 将该节点加入生成,并将该边加入生成的边集 mst.append(min_edge) visited.add(min_edge[1]) return mst ``` 其,`graph`是一个字典,表示无向的邻接表。例如,对于以下无向: ``` 2 - 3 / / \ 1 - 4 - 5 ``` 可以表示为: ```python graph = { 1: {2: 1, 4: 3}, 2: {1: 1, 3: 1, 4: 2}, 3: {2: 1, 4: 2, 5: 1}, 4: {1: 3, 2: 2, 3: 2, 5: 1}, 5: {3: 1, 4: 1} } ``` 调用`prim(graph)`函数即可得到该的最小生成

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值