当前位置: 首页 > news >正文

最短路径查找Dijkstra算法

1、解决的是最短路径问题。

      从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径。其实dijkstra算法在交通中应用还是相对广泛的,可以用于需要车辆从a点到b点的最短路径(list)。

2、算法的特点:

       使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

3、实例(步骤拆分,以无向图为例)

统一思路:

      ●每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中。

      ●计算刚加入节点A的邻近节点B(不包含标记的节点)的距离,如果(节点A的距离+节点A到节点B的边长) < 节点B的距离,就更新节点B的距离和前面点。

     其中0为起点,4为终点。

第一步:

     距离起始节点0(或者出发点)距离最近的,当然是0,首先标记0号节点。

 第二步:

      从起始节点0开始,0的临界节点是①和⑦,距离初始节点距离分别是4和8。然后在未标记点中,寻找距离出发点最近的点,作为标记点。

      ①在未标记点中,find离出发点0距离最近,标记节点①,收录到最优路径节点中。并更新新标记的节点①的临近节点。

第三步:

     节点①的临近节点分别是节点②和节点⑦,到节点①的边长分别为8和11。从节点0出发到②的最优路径,经过节点①的话,4+8 < 无穷大,则更新②到出发点的距离,并更新②前边的节点:①

     假如从出发点0经过节点①到节点⑦,这个距离为4+11=15,这个距离 > 节点⑦本来的距离,所以说节点⑦不更新(大于或等于都不更新)

    从未标记的点中, find离出发点0距离最近,标记节点⑦,收录到最优路径节点中。并更新新标记的节点⑦的临近节点。

第四步:

     上一步更新点⑦,临近节点⑧和⑥离出发点0的距离。

     临近节点⑧和⑥的距离分别是15和9,都比无穷大要小,更新。

    对比未标记节点,标记节点⑥,并计算⑥的邻近节点⑤和⑧,分别是11、15。

    同样标记节点⑤,计算⑤的邻近节点距离

循环上述的操作:

  最终得出,最短路径是21,路径节点顺序(从目的节点倒着推:④⑤⑥⑦) 顺序如下图:

 代码:

import math
V = 6
# 标记数组:used[v]值为False说明改顶点还没有访问过,在S中,否则在U中!
used = [False for _ in range(V)]
# 距离数组:distance[i]表示从源点s到i的最短距离,distance[s]=0
distance = [float('inf') for _ in range(V)]
# cost[u][v]表示边e=(u,v)的权值,不存在时设为INF
# cost领接表
cost = [[float('inf') for _ in range(V)] for _ in range(V)]
def dijkstra(s):
    distance[s] = 0
    while True:
        # v在这里相当于是一个哨兵,对包含起点s做统一处理!
        v = -1
        # 从未使用过的顶点中选择一个距离最小的顶点
        for u in range(V):
            if not used[u] and (v == -1 or distance[u] < distance[v]):
                v = u
        if v == -1:
            # 说明所有顶点都维护到S中了!
            break

        # 将选定的顶点加入到S中, 同时进行距离更新
        used[v] = True
        # 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
        for u in range(V):
            distance[u] = min(distance[u], distance[v] + cost[v][u])

# if __name__ == '__main__':
#
for _ in range(9):
    v, u, w = list(map(int, input().split()))
    cost[v][u] = w
    cost[u][v] = w
s = int(input('请输入一个起始点:'))
dijkstra(s)
print(distance)


相关文章:

  • [数字媒体] Photoshop基础之图像校正、抠图(证件照)和融合
  • 【毕业设计】基于的单片机的移动硬盘设计与实现 - stm32 嵌入式 物联网
  • 使用Python的requests库发送SOAP请求,错误码415
  • Python爬虫技术系列-02HTML解析-lxml+BS4
  • 今日头条——机器学习算法岗1234面
  • 【笔记】快速理解傅里叶级数
  • 宣布发布 .NET 7 Release Candidate 1
  • 8万Star,这个开源项目有点强
  • 数据批处理速度慢?不妨试试这个
  • 透过安全事件剖析黑客组织攻击技术(2FA/MA的攻击手法)
  • java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏
  • 29、Java 中的接口详解
  • mysql中怎么防止数据丢失
  • 软件开发中会使用到的图
  • 汇编语言入门(二)
  • CentOS从零开始部署Nodejs项目
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • DataBase in Android
  • emacs初体验
  • Fabric架构演变之路
  • JavaScript服务器推送技术之 WebSocket
  • Java多线程(4):使用线程池执行定时任务
  • KMP算法及优化
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • NSTimer学习笔记
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SQLServer之创建显式事务
  • 初识 beanstalkd
  • 聊聊flink的TableFactory
  • 前嗅ForeSpider采集配置界面介绍
  • 找一份好的前端工作,起点很重要
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 昨天1024程序员节,我故意写了个死循环~
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #mysql 8.0 踩坑日记
  • ()、[]、{}、(())、[[]]命令替换
  • (06)金属布线——为半导体注入生命的连接
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT)一个美国文科博士的YardLife
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转)大道至简,职场上做人做事做管理
  • (转)负载均衡,回话保持,cookie
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ./和../以及/和~之间的区别
  • .Family_物联网
  • .gitignore文件—git忽略文件
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证