利用dijkstra算法,来完成图中两个顶点间最短的距离,可以直接复制使用,只需要修改参数即可

  1. def dijkstra_raw(edges, from_node, to_node):
  2. """
  3. 将节点信息和边进行比较获取正确的边集
  4. :param edges:
  5. :param from_node:
  6. :param to_node:
  7. :return:正无穷大
  8. """
  9. g = defaultdict(list)
  10. for l, r, c in edges:
  11. g[l].append((c, r))
  12. q, seen = [(0, from_node, ())], set()
  13. while q:
  14. (cost, v1, path) = heappop(q)
  15. if v1 not in seen:
  16. seen.add(v1)
  17. path = (v1, path)
  18. if v1 == to_node:
  19. return cost, path
  20. for c, v2 in g.get(v1, ()):
  21. if v2 not in seen:
  22. heappush(q, (cost + c, v2, path))
  23. # inf 表示正无穷大
  24. return float("inf"), []
  25.  
  26. def dijkstra(edges, from_node, to_node):
  27. """
  28. gain the shortest path and this node information
  29. :param edges: this is a array of path
  30. :param from_node: start node
  31. :param to_node: end node
  32. :return: the shortest path and this node information
  33. """
  34. len_shortest_path = -1
  35. ret_path = []
  36. length, path_queue = dijkstra_raw(edges, from_node, to_node)
  37. if len(path_queue) > 0:
  38. # 1. Get the length firstly;
  39. len_shortest_path = length
  40. # 2. Decompose the path_queue, to get the passing nodes in the shortest path.
  41. left = path_queue[0]
  42. # 2.1 Record the destination node firstly;
  43. ret_path.append(left)
  44. right = path_queue[1]
  45. while len(right) > 0:
  46. left = right[0]
  47. # 2.2 Record other nodes, till the source-node.
  48. ret_path.append(left)
  49. right = right[1]
  50. # 3. Reverse the list finally, to make it be normal sequence.
  51. ret_path.reverse()
  52. return len_shortest_path, ret_path
  53.  
  54. def get_shortest_path(start_node, end_node):
  55. """
  56. the shortest_path of matrix
  57. :param start_node: start_position
  58. :param end_node: end_position
  59. :return: the shortest_path
  60. """
  61. # endless是不存在边的界限
  62. endless = 0
  63. edges_list = []
  64. m_top = get_array(0)
  65. for i in range(len(m_top)):
  66. for j in range(len(m_top[0])):
  67. if i != j and m_top[i][j] != endless:
  68. edges_list.append((i, j, m_top[i][j])) # (i,j) is a link; m_top[i][j] here is 1, the length of link (i,j).
  69. return dijkstra(edges_list, start_node, end_node)

python利用dijkstra算法求解图中最短距离的更多相关文章

  1. Python利用最优化算法求解投资内部收益率IRR【一】

    一. 内部收益率和净现值 内部收益率(Internal Rate of Return, IRR)其实要和净现值(Net Present Value, NPV)结合起来讲.净现值指的是某个投资项目给公司 ...

  2. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  3. Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...

  4. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  5. Dijkstra算法求解最短路径分析

    最短路径是图论算法中的经典问题.图分为有向图.无向图,路径权值有正值.负值,针对不同的情况需要分别选用不同的算法.在维基上面给出了各种不同的场景应用不同的算法的基本原则:最短路问题. 针对无向图,正权 ...

  6. 利用Dijkstra算法实现记录每个结点的所有最短路径

    最近在做PAT时发现图论的一些题目需要对多条最短路径进行筛选,一个直接的解决办法是在发现最短路径的时候就进行判断,选出是否更换路径:另一个通用的方法是先把所有的最短路径记录下来,然后逐个判断.前者具有 ...

  7. JAVA之单源最短路径(Single Source Shortest Path,SSSP问题)dijkstra算法求解

    题目简介:给定一个带权有向图,再给定图中一个顶点(源点),求该点到其他所有点的最短距离,称为单源最短路径问题. 如下图,求点1到其他各点的最短距离 准备工作:以下为该题所需要用到的数据 int N; ...

  8. [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

    相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...

  9. 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...

随机推荐

  1. 配置OEL7 YUM源

    用于其他发行版如rhel.centos有时候要用到oracle linux的源来装软件比如oracle.mysql等 配置oel7源 wget http://public-yum.oracle.com ...

  2. Flask 中字典数据返回(jsonify)

    不多说,直接上代码,flask中的字典数据的处理: from flask import Flask, jsonify app = Flask(__name__, static_folder=" ...

  3. <code> 标签 让一段计算机代码显示在网页中

    <code> 标签 解释:要让一段计算机代码显示在网页中,那么这段代码需要用<code> 标签包起来,不然他会被当作网页的代码被 运行. 例如: <code>< ...

  4. pod install/update失败:Failed to connect to 127.0.0.1 port 1080: Connection refused

    出现这类错误,通常是因为代理发生的,取消代理即可! 1.查看有无相关代理: git config --global http.proxy git config --global https.proxy ...

  5. dapi 基于Django的轻量级测试平台六 怎样使用压测功能

    QQ群: GitHub:https://github.com/yjlch1016/dapi JMeter非GUI模式下: jmeter -n -t jmx脚本 -l jtl文件 -e -o 测试报告目 ...

  6. D. Maxim and Array

    https://www.cnblogs.com/qscqesze/p/5925893.html  原博客 http://codeforces.com/group/1EzrFFyOc0/contest/ ...

  7. 前几天去电脑城升级了下主机配置(酷睿i3-9100F)

    因为自用电脑配置有点儿低了,前几天路过电脑城正好顺便升级下主机配置. 平时又不玩儿什么游戏,只是简单的使用,于是酷睿i3-9100F就成为了我的选择. 酷睿i3-9100F 四核四线程,不带核显(GP ...

  8. 201671010459 张旭辉 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课程学习内容 github仓库地址链接 [Git ...

  9. 三星固态Dell版的960g的sm863a硬盘

    smart参数 CrystalDiskMark测试 AS SSD 测试 HD Tune Pro测试 DiskGenius查看 总结: 按我的测试,性能比sm865的还好,不知道咋回事,按三星给的参数这 ...

  10. volatile 关键字 和 i++ 原子性

    package com.mozq.multithread; /** * 深入理解Java虚拟机 volatile 关键字 和 i++ 原子性. */ public class VolatileTest ...