【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

【路径规划】(2) A* 算法求解最短路,附python完整代码 A* 算法主要用在静态且周围环境已知的情况下,是建立在 Dijkstra 和BFS 基础上的启发式遍历搜索算法,在路径规划时不仅要考虑自身与最近节点位置的距离(Dijkstra 实现),还需要考虑自身位置与目标点的距离(BFS 实现)。 阅读详情

基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解,可以识别网络中是否含有负环。

1. 适用场景

  • 可识别网络中存在的负环
  • 起点与终点间至少存在一条可行路径
  • 可求解单一起点到多点的最短路径

2. 负环识别方法

在介绍网络负环识别方法之前,先定义几个符号:
n n n:网络节点数量
C C C:网络弧费用绝对值的最大值
根据《netwrok flow》文献介绍,针对label correcting algorithms有以下识别方法:

  • 如果某一节点的距离标签小于 − n C -nC −nC 则说明存在负环(在最坏情况下源点到此点经过所有节点,所有的弧费用值的绝对值都是C,则最小的cost为 − n C -nC −nC)
  • 首先将源节点指定为已标记节点,而将所有其他节点指定为未标记的。然后,我们一个接一个检查每个未标记节点 k k k,并执行以下操作:标记节点 k k k,溯回节点 k k k的前向节点并将其标记,直到我们到达第一个标记节点 l l l,如果 k = l k=l k=l则网络中存在负环。
  • 标记每个网络节点被检查最优性条件的次数,如果次数超过了网络节点数-1,则网络中存在负环。

3. 测试网络

这里在测试网络中人为设立一个负环结构,如下图红色示意图。
在这里插入图片描述

4. 代码实现

(1)定义网络数据结构

class Network():
    def __init__(self):
        self.node_neighbors={}
        self.node_x_coord={}
        self.node_y_coord={}
        self.node_id_list=[]
        self.number_of_nodes=0
        self.number_of_check={}
        self.link_cost={}
        self.link_list=[]
        self.max_link_cost=None

        self.source_node_id=0
        self.sink_node_id=1

(2)读取网络文件

# read network csv files
def read_network_file(node_file,link_file,network):
    # read node csv file
    with open(node_file) as node_f:
        node_reader=csv.reader(node_f)
        next(node_reader)
        for row in node_reader:
            network.node_id_list.append(int(row[0]))
            network.node_x_coord[int(row[0])] = float(row[1])
            network.node_y_coord[int(row[0])] = float(row[2])
            network.node_neighbors[int(row[0])] = []
            network.number_of_check[int(row[0])]=0
    # read link csv file
    with open(link_file) as f:
        link_reader = csv.reader(f)
        next(link_reader)
        for row in link_reader:
            from_node_id = int(row[1])
            to_node_id = int(row[2])
            cost = float(row[3])
            network.node_neighbors[from_node_id].append(to_node_id)
            network.link_list.append([from_node_id, to_node_id])
            network.link_cost[from_node_id, to_node_id] = cost
    network.number_of_nodes = len(network.node_id_list)
    network.max_link_cost=max(network.link_cost.values())

(3)可视化最短路径

def show_shortest_path(net,path_node_id_list):
    for from_node_id,to_node_id in net.link_list:
        x_coords=[net.node_x_coord[from_node_id],net.node_x_coord[to_node_id]]
        y_coords=[net.node_y_coord[from_node_id],net.node_y_coord[to_node_id]]
        plt.plot(x_coords,y_coords,color='black',linewidth=0.5)
    path_x_coord=[]
    path_y_coord=[]
    for node_id in path_node_id_list:
        path_x_coord.append(net.node_x_coord[node_id])
        path_y_coord.append(net.node_y_coord[node_id])
    plt.plot(path_x_coord,path_y_coord,color='b')
    plt.xlabel('x_coord')
    plt.ylabel('y_coord')
    plt.show()

(4)保存最短路径信息

# save the shortest path information to csv file
def save_to_file(network,path_node_id_list,path_cost,node_predecessor=None,node_label_cost=None):
    outfile = open('shortest_path.csv', 'w', newline='', errors='ignore')
    write = csv.writer(outfile)

    write.writerow(['source_node_id', 'sink_node_id', 'total cost', 'path node id list'])
    path = '-'.join([str(i) for i in path_node_id_list])
    line = [network.source_node_id, network.sink_node_id,path_cost,path]
    write.writerow(line)
    # whether save the shortest path information from  the source node to other nodes
    if node_predecessor and node_label_cost:
        try:
            for node_id in network.node_id_list:
                if node_id!=network.source_node_id and node_id!=network.sink_node_id:
                    path_node_id_list = [node_id]
                    pre_node_id = node_predecessor[node_id]
                    path_cost = 0
                    if node_label_cost[node_id]<float('inf'):
                        while pre_node_id != network.source_node_id:
                            path_node_id_list.insert(0, pre_node_id)
                            path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
                            pre_node_id = node_predecessor[pre_node_id]
                        path_node_id_list.insert(0, network.source_node_id)
                        path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
                        path = '-'.join([str(i) for i in path_node_id_list])
                        line = [network.source_node_id, node_id, path_cost, path]
                        write.writerow(line)
                    else:
                        line = [network.source_node_id, node_id, 'inf', 'nan']
                        write.writerow(line)
        except Exception as e:
            pass
    outfile.close()

(5)采用label correcting算法的deque实现寻找最短路径(含负环识别)

# find the shortest path from source node to sink node using deque label correcting algorithm
def find_shortest_path(network):
    node_predecessor = {}
    node_predecessor[network.source_node_id]=-1
    node_label_cost = { node_id:float('inf') for node_id in network.node_id_list}
    node_label_cost[network.source_node_id] = 0
    SEList = deque()
    SEList_all = []
    SEList.append(network.source_node_id)
    SEList_all.append(network.source_node_id)
    while len(SEList)>0:
        current_node_id=SEList[0]
        SEList.popleft()
        current_node_label_cost = node_label_cost[current_node_id]
        for to_node_id in network.node_neighbors[current_node_id]:
            new_label=current_node_label_cost+network.link_cost[current_node_id,to_node_id]
            network.number_of_check[to_node_id]+=1
            if new_label<node_label_cost[to_node_id]:
                node_label_cost[to_node_id]=new_label
                node_predecessor[to_node_id]=current_node_id
                if to_node_id in SEList_all:
                    SEList.insert(0,to_node_id)
                else:
                    SEList.append(to_node_id)
                SEList_all.append(to_node_id)
                # check whether the new label has fallen below -n*max_link_cost(detecting negative cycle)
                if new_label<-network.max_link_cost or network.number_of_check[to_node_id]>network.number_of_nodes-1:
                    path_node_id_list = [to_node_id]
                    pre_node_id = node_predecessor[to_node_id]
                    while pre_node_id != to_node_id:
                        path_node_id_list.insert(0, pre_node_id)
                        pre_node_id = node_predecessor[pre_node_id]
                    path_node_id_list.insert(0, to_node_id)
                    path = '-'.join([str(i) for i in path_node_id_list])
                    print("there exists a negative cycle:%s"%path)
                    sys.exit(0)

    path_node_id_list = [network.sink_node_id]
    pre_node_id = node_predecessor[network.sink_node_id]
    path_cost = 0
    if node_label_cost[network.sink_node_id]<float('inf'):
        while pre_node_id != network.source_node_id:
            path_node_id_list.insert(0, pre_node_id)
            path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
            pre_node_id = node_predecessor[pre_node_id]
        path_node_id_list.insert(0, network.source_node_id)
        path_cost += network.link_cost[path_node_id_list[0], path_node_id_list[1]]
        path = '-'.join([str(i) for i in path_node_id_list])
        print("the trave cost from node id=%s to node id=%s is: %s" % (network.source_node_id, network.sink_node_id, path_cost))
        print("the shortest path from node id=%s to node id=%s is: %s" % (network.source_node_id, network.sink_node_id, path))

        show_shortest_path(network, path_node_id_list)
        save_to_file(network, path_node_id_list, path_cost,node_predecessor,node_label_cost)
    else:
        print("there is no feasible path from node id=%s to node id=%s"%(network.source_node_id,network.sink_node_id))

(6)负环识别实现
这里实现了两种负环检测方法,一种是通过节点的距离标签判断,一种是通过节点最优性条件检查次数判断,满足任一条件即可。

 # check whether the new label has fallen below -n*max_link_cost(detecting negative cycle)
                if new_label<-network.max_link_cost or network.number_of_check[to_node_id]>network.number_of_nodes-1:
                    path_node_id_list = [to_node_id]
                    pre_node_id = node_predecessor[to_node_id]
                    while pre_node_id != to_node_id:
                        path_node_id_list.insert(0, pre_node_id)
                        pre_node_id = node_predecessor[pre_node_id]
                    path_node_id_list.insert(0, to_node_id)
                    path = '-'.join([str(i) for i in path_node_id_list])
                    print("there exists a negative cycle:%s"%path)
                    sys.exit(0)

(7)主程序

if __name__=='__main__':
    # init network data struct
    network=Network()
    # setting source node  id and sink node id
    network.source_node_id=1
    network.sink_node_id=81
    # read network files
    read_network_file('./node_2.csv','./link_2.csv',network)
    # check whether the source node id and sink node id is in the network
    if network.source_node_id not in network.node_id_list:
        print(" %s not found"%network.source_node_id)
        sys.exit(0)
    if network.sink_node_id not in network.node_id_list:
        print(" %s not found"%network.sink_node_id)
        sys.exit(0)
    # find the shortest path
    find_shortest_path(network)

5. 求解结果

(1)无负环
在这里插入图片描述

(2)存在负环
在这里插入图片描述

6. 代码及数据文件

相关代码及数据文件可从github主页获取:

https://github.com/PariseC/Shortest_Path_Algorithm/tree/master/label_correcting_algorithm

参考

  1. R.K. Ahuja, T.L. Magnanti and J.B. Orlin, Network Flows: Theory, Algorithms, and Applications. Prentice-Hall, 1993. A comprehensive recent survey of the topic.
【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

相关推荐

【信息科学与工程学】【数据中心】 第二十三篇【智算中心】DDC网络-满足大规模训练、推理、存储区网络(Roce2组网)-01

设计维度目标值设计原则实现手段评估指标性能目标​端到端延迟<10ms低延迟优先RDMA优化,拓扑扁平化延迟分布,p99延迟可用性目标​99.99%可用性冗余设计多路径,设备冗余MTBF,MTTR吞吐目标​核心交换>10Tbps无阻塞交换大带宽核心,Clos架构对分带宽扩展性目标​线性扩展至1000节点模块化设计标准Pod架构扩展成本函数安全目标​零信任架构纵深防御微分段,加密传输安全事件数能效目标​PUE<1.2绿色计算高效设备,智能调度能效比(W/IOPS) 2. 物理拓扑设计 2.1 数据中心物理

weixin_49199313的博客 564

Python实现最短路问题常见求解算法1——Label Correcting Algorithm(deque)

原文链接 1. 适用场景 无负环网络 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 算法说明 应用标号法求解最短路问题时有两种选择,一是采用 label setting 策略,即 label setting algorithm,如经典的 Dijkstra’s algorithm ,或采用label correcting策略,即 label correcting algorithm,如经典的 FIFO label correcting algorithm、Deque label

qq_36744449的博客 1483

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

Python实现最短路问题常见求解算法——A*算法

基于python语言,实现A*算法对最短路问题(Shortest Path Problem)进行求解。

Better.C的博客 3041

【信息科学与工程学】计算机科学与自动化——第一百五十五篇 缓存系统设计01 基础知识

CPU:拥有 L1/L2/L3 多级缓存,用于暂存即将执行的指令和频繁访问的数据。GPU:包含显存、纹理缓存、常量缓存、指令缓存等,加速图形渲染和通用计算。RAID 卡 / 存储控制器:自带缓存(通常带电池保护),用于合并写操作、加速读写。打印机:内置内存缓存,用于暂存待打印的页面数据,避免反复从电脑传输。光驱 / 蓝光播放器:内部缓存用于平滑读取光盘数据,防止因寻道延迟导致卡顿。操作系统:页缓存(Page Cache):缓存文件系统数据,减少磁盘 I/O。目录缓存(dentry cache):加速路径查找

weixin_49199313的博客 290

An Exact Label-Correcting Algorithm

An Exact Label-Correcting Algorithm for the Online Shortest Path Problem in Cyclic Graph 算法

【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)

基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解。

Better.C的博客 2191

python_algorithms:这是一个项目,主要分享一些解决书中习题的代码,Python Algorithms

Python_算法 介绍 这个项目主要是关于我在 Magnus Lie Hetland所著的Python Algorithms: Mastering Basic Algorithms in the Python Language一书中的笔记和一些练习。

网络流规划中的Label Correcting Algorithm详解与C++实现

Label Correcting Algorithm 主要用于求解有向图中的单源最短路径问题,与 Dijkstra 算法类似,但它能够更好地处理图中存在负权重边的情况。该算法使用一个队列来存储待处理的顶点,并且允许顶点在队列中多次出现。Label Correcting Algorithm 提供了一个强大的工具,用于解决单源最短路径问题,尤其是在图中存在负权重边的情况下。虽然它在理论上的性能可能不如其他算法,如 Dijkstra 或 Bellman-Ford 算法,但它在处理特定类型的图时非常有效。

qq_41551761的博客 1382

基于STM32-XPC仿真平台的构架

基于STM32-XPC仿真平台的构架 xPC Target是MathWorks公司的MATLAB提供的一个基于RTW(Real-Time Workshop)体系框架的附加产品,是一种用于产品原型开发、测试和配置实时系统的PC机解决途径。xPC目标实时仿真系统能够使开发者在产品开发前进行产品原型的快速实现、测试和评估,是 Simulink 工具集下用于产品原型开发设计测试集于一体的工具箱。

sujianbonwpu的博客 4489

WinCC7.5SP2生成PDF报表显示有错误或残缺的问题及解决方法

WinCC V7.5 SP2 自带的生成PDF报表功能异常。生成的PDF报表内容显示空白或有残缺。经测试后发现可以通过替换Adobe PDF Library库文件的方法解决该问题。

commandboy的博客 3660

Python实现最短路问题常见求解算法2——Label Correcting Algorithm(deque)

原文链接 1. 适用场景 可识别网络中存在的负环 起点与终点间至少存在一条可行路径 可求解单一起点到多点的最短路径 2. 负环识别方法 在介绍网络负环识别方法之前,先定义几个符号: nnn :网络节点数量 CCC :网络弧费用绝对值的最大值 根据《netwrok flow》文献介绍,针对label correcting algorithms有以下识别方法: 如果某一节点的距离标签小于 −nC−nC−nC 则说明存在负环(在最坏情况下源点到此点经过所有节点,所有的弧费用值的绝对值都是C,则最小的cos

qq_36744449的博客 527

EtherCAT主站SOEM -- 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 1998

最短路标号法python_最短路问题与标号算法(label correcting algorithm)研究(1) - 开篇介绍...

作者:崔赞扬、李崇楠指导老师:周学松教授校对:邓发珩、周航、向柯玮 序言本系列推文重在从算法基本原理、复杂度分析、优缺点、代码实现、算法扩展等方面科普Label Correcting Algorithm(最短路算法重要分支),同时给出了下一步学习内容建议。本文在周学松教授的指导下完成,特别感谢周学松教授的全程指导,感谢姚宇、牛志强、张宇丰在文章结构、内容安排、内容校对等方面提出的宝贵建议...

weixin_42517137的博客 1090

一文搞定 ST22 短转储 MEMORY_NO_MORE_PAGING:看懂 SAP Paging 机制,参数 rdisp/PG_SHM 与 rdisp/PG_MAXFS 怎么设才稳

SAP系统MEMORY_NO_MORE_PAGING错误通常源于Paging资源耗尽而非物理内存不足。关键排查点包括:通过ST22确认错误类型,ST02监控Paging使用情况,检查工作进程trace中的"no more free blocks"提示。解决方案建议将rdisp/PG_SHM和rdisp/PG_MAXFS设为相同值(如250000块≈2GB),使Paging完全在内存中运行。同时需优化易耗Paging的代码逻辑,如避免滥用EXTRACT命令和超大内存对象传输。典型案例如月末

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 335

大唐杯5G考前冲刺篇(回顾全文重点必看)

大唐杯习题复习指南

nimo观察者 1万+

Label Correcting Algorithm(Python实现)

代码: from collections import deque import numpy as np class edge: #定义边 def __init__(self,start,end,cost): self.Start=start self.End=end self.Cost=cost...

OI -> ACM -> AI 2176

MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能

该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。

huanghm88的专栏 583

Dijkstra与Bellman-Ford算法:最短路径核心原理与工程选型指南

最短路径算法是图论中的基础概念,用于在带权图中寻找两点间总权重最小的路径。其核心原理在于通过迭代松弛操作,不断更新顶点间的最短距离估计值,直至收敛到最优解。这类算法具有重要的技术价值,是实现网络高效路由、物流智能调度等复杂系统优化的关键。在应用场景上,Dijkstra算法凭借其贪心策略和堆优化,成为地图导航、OSPF路由协议等正权图场景下的高效选择;而Bellman-Ford算法则因其能处理负权边并检测负权环,在金融套利路径分析等场景中不可或缺。本文聚焦于这两个经典的单源最短路径算法,深入对比其核心思想、实

weixin_33871366的博客 352

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模中管道铺设问题的Python求解:从最小生成树到混合整数规划

网络优化是运筹学和计算机科学中的核心问题,旨在通过图论模型寻找资源分配或连接方案的最优解。其基本原理是将实际问题抽象为节点和边构成的图,利用算法在满足约束条件下优化目标函数,如成本最小化或流量最大化。该技术在工程领域价值显著,能有效解决物流配送、通信网络设计等复杂决策问题。在基础设施规划特别是管道铺设场景中,网络优化需要融合图论、整数规划和流体力学,以平衡建设成本与水力性能。本文聚焦数学建模竞赛中的经典难题,探讨如何运用Python将最小生成树、混合整数非线性规划等算法,转化为应对地形、管径、流量多约束的实

weixin_33895516的博客 425

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LaTeX+Python数学建模闭环路径:从公式推导到可验证代码

数学建模的核心能力不是堆砌工具或背诵模型,而是建立‘问题定义→逻辑推导→计算验证→文档固化’的完整闭环。LaTeX 不仅是排版工具,更是强制结构化思维、暴露隐藏假设的逻辑组织系统;Python 也不仅是实现载体,而是通过 assert 断言、KS 检验、AIC 准则等手段让模型与算法具备可审查性。本文聚焦无线解调算法基础、vscode latex安装、latex cref 等高频实践痛点,揭示工具链断裂的本质——缺乏写即思、算即验、验即固的动作咬合。适用于竞赛入门、跨专业建模及工程快速验证场景,强调每一步都

weixin_34220179的博客 393

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python+AI构建智能旅游咨询平台的技术实践

自然语言处理(NLP)和推荐系统是AI技术的核心应用领域,通过语义理解将用户模糊需求转化为结构化查询,结合协同过滤算法实现个性化推荐。在旅游行业,这种技术组合能显著提升用户体验,典型应用包括智能问答、动态行程规划和实时价格预测。本文以Django+Flask混合架构为例,详解如何整合BERT意图识别、遗传算法路径优化等关键技术,解决旅游咨询场景中的冷启动、多模态数据处理等工程挑战。项目实践表明,采用Sentence-BERT的语义匹配方案使问答准确率提升32%,Prophet时间序列模型在节假日价格预测上比

weixin_30265103的博客 403

Dijkstra(迪杰斯特拉)求解最短路(附python代码和可视化)

文章目录前言一、最短路模型二、迪杰斯特拉算法二、python代码实现结果展示 前言 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。该算法在运筹学和数据结构图论部分都有介绍,是一种非常有效的求解单源最短路问题的算法 提示:以下是本篇文章正文内容,.

zaowuyingshu的博客 4153

python实现Dijkstra算法求最短路径

最近在考研复习,刚好学到图这一章了,然后也是学到关于图最难的几个部分了,一个是最小生成树(Prim算法和Kruskal算法),还一个就是最短距离问题了(Dijkstra算法和Floyd算法),我感觉前三个算法都还蛮好理解,就是最后一个Floyd有点没整明白,前三个算法基本上都用到贪心的思想,Prim每次都选择当前未使用的消耗最小的顶点(选点);Kruskal每次都是当前未使用的权值最小的边(选边);Dijkstra的思想和Prim的思想大致一直。这里我就直接贴出源码了,python实现的,有兴趣的可以运行试

max_LLL的博客 3654
上一篇: 【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
下一篇: 【基础篇】Python+Gurobi求解运输问题建模实践
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值