python利用dijkstra算法求解图中最短距离
利用dijkstra算法,来完成图中两个顶点间最短的距离,可以直接复制使用,只需要修改参数即可
def dijkstra_raw(edges, from_node, to_node):
"""
将节点信息和边进行比较获取正确的边集
:param edges:
:param from_node:
:param to_node:
:return:正无穷大
"""
g = defaultdict(list)
for l, r, c in edges:
g[l].append((c, r))
q, seen = [(0, from_node, ())], set()
while q:
(cost, v1, path) = heappop(q)
if v1 not in seen:
seen.add(v1)
path = (v1, path)
if v1 == to_node:
return cost, path
for c, v2 in g.get(v1, ()):
if v2 not in seen:
heappush(q, (cost + c, v2, path))
# inf 表示正无穷大
return float("inf"), [] def dijkstra(edges, from_node, to_node):
"""
gain the shortest path and this node information
:param edges: this is a array of path
:param from_node: start node
:param to_node: end node
:return: the shortest path and this node information
"""
len_shortest_path = -1
ret_path = []
length, path_queue = dijkstra_raw(edges, from_node, to_node)
if len(path_queue) > 0:
# 1. Get the length firstly;
len_shortest_path = length
# 2. Decompose the path_queue, to get the passing nodes in the shortest path.
left = path_queue[0]
# 2.1 Record the destination node firstly;
ret_path.append(left)
right = path_queue[1]
while len(right) > 0:
left = right[0]
# 2.2 Record other nodes, till the source-node.
ret_path.append(left)
right = right[1]
# 3. Reverse the list finally, to make it be normal sequence.
ret_path.reverse()
return len_shortest_path, ret_path def get_shortest_path(start_node, end_node):
"""
the shortest_path of matrix
:param start_node: start_position
:param end_node: end_position
:return: the shortest_path
"""
# endless是不存在边的界限
endless = 0
edges_list = []
m_top = get_array(0)
for i in range(len(m_top)):
for j in range(len(m_top[0])):
if i != j and m_top[i][j] != endless:
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).
return dijkstra(edges_list, start_node, end_node)
python利用dijkstra算法求解图中最短距离的更多相关文章
- Python利用最优化算法求解投资内部收益率IRR【一】
一. 内部收益率和净现值 内部收益率(Internal Rate of Return, IRR)其实要和净现值(Net Present Value, NPV)结合起来讲.净现值指的是某个投资项目给公司 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- python利用or在列表解析中调用多个函数.py
python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...
- Dijkstra算法求解最短路径分析
最短路径是图论算法中的经典问题.图分为有向图.无向图,路径权值有正值.负值,针对不同的情况需要分别选用不同的算法.在维基上面给出了各种不同的场景应用不同的算法的基本原则:最短路问题. 针对无向图,正权 ...
- 利用Dijkstra算法实现记录每个结点的所有最短路径
最近在做PAT时发现图论的一些题目需要对多条最短路径进行筛选,一个直接的解决办法是在发现最短路径的时候就进行判断,选出是否更换路径:另一个通用的方法是先把所有的最短路径记录下来,然后逐个判断.前者具有 ...
- JAVA之单源最短路径(Single Source Shortest Path,SSSP问题)dijkstra算法求解
题目简介:给定一个带权有向图,再给定图中一个顶点(源点),求该点到其他所有点的最短距离,称为单源最短路径问题. 如下图,求点1到其他各点的最短距离 准备工作:以下为该题所需要用到的数据 int N; ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...
随机推荐
- vue-router 在新窗口打开页面的功能
项目中,需要点击链接后再新窗口打开页面,大家知道vue是单页面应用开发框架,那么也不是不可以实现这个功能 很简单,详情看下面 1.<router-link>标签实现新窗口打开 <ro ...
- set实现交集,并集,差集
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // ...
- FPM八:FPM TREE
先上效果图: 1,新建类:ZCL_FPM_TREE,并添加接口:IF_FPM_GUIBB,IF_FPM_GUIBB_TREE.激活所有方法 2.定义tree结构,在class的public secti ...
- Class.forName() 与 ClassLoader.loadClass()的区别
看到一个面试题,说说Class.forName() 与 ClassLoader.loadClass()的区别,特意记录一下,方便后续查阅. 在我们写java代码时,通常用这两种方式来动 ...
- c++产生验证码字符串
// // Created by lk on 18-10-14. // #include <iostream> #include <cstdlib> #include < ...
- centos7下安装docker 以及简单使用
一 环境准备1.虚拟机or物理机 2.centos7系统(稳定,对docker支持友好) 二 安装过程step1:使用yum命令进行安装 yum install -y docker备注:-y 表示不询 ...
- 查询接口---flask+python+mysql
环境准备 安装flask pip install flask 项目结构如图 1.新建配置文件conf.py #!/usr/bin/python# -*- coding:utf-8 -*- impor ...
- JMeter5.1开发http协议接口之form表单脚本
get请求--jmeter:form表单 下载文件 响应结果 post请求--jmeter:form表单 登录请求 响应结果 post请求--jmeter:form表单中传token 请求(token ...
- Python基础之函数定义及文件修改
函数 函数的定义 #登录函数和注册函数 def register(): """注册函数""" username = input('请输入你的 ...
- swagger 配置- ssm
swagger 配置 - ssm swagger 是一个用来看接口的工具,具体效果如下,这里用的是swagger2 1.porm.xml <dependency> <groupId& ...