【python算法】最短路径算法之dirjkstra单源最短路径模板

简介: 【python算法】最短路径算法之dirjkstra单源最短路径模板

学习导图:


1dc618a0ed9580ce8bfa6facb208c08f.png

【模板】单源最短路径


亲,题目链接请戳这里


题目描述


       给定一个n个点,m条有向边的带非负权图,请你计算从s出发,到每个点的距离。


数据保证你能从s出发到任意点。


输入格式


       第一行为三个正整数n, m,s。第二行起m行,每行三个非负整数uL;, u;, u;,表示从u;到v;有一条权值为w;的有向边。


输出格式


输出一行n个空格分隔的非负整数,表示s到每个点的距离。

1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png


参考题解


import heapq
from collections import defaultdict
# 核心代码
def dirjkstra():
    # 各节点到start的最短距离
    dirs = [float('inf')] * (n + 1)
    dirs[start] = 0
    # 已用节点,比set还快20% 所有没有释放False
    seen = [False] * (n + 1)
    pq = []
    heapq.heappush(pq, (0, start))
    # BFS
    while pq:
        # 获取
        _, u = heapq.heappop(pq)
        # 该节点是否用过
        if seen[u]:
            continue
        else:
            seen[u] = True
        # 找到邻接节点
        nodeList = graph[u]
        for v, w in nodeList:
            t = dirs[u] + w
            if t < dirs[v]:
                dirs[v] = t
                # 如果该邻接节点没有访问过才把该最短边加进去
                if not seen[v]:
                    heapq.heappush(pq, (t, v))
    if dirs[-1] == float('inf'):
        return -1
    else:
        return dirs[-1]
# 输入
n, m = map(int, input().split())
# 初始化
start = 1
# 建图
graph = defaultdict(list)
for _ in range(m):
    u, v, w = map(int, input().split())
    graph[u].append((v,w))
answer = dirjkstra()
print(answer)


【蓝桥真题】单源最短路径


试题:路径


本体总分:10分


【问题描述】        


       小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。


       小蓝的图由 2021个结点组成,依次编号1至2021。


       对于两个不同的结点a, b,如果a和b的差的绝对值大于21,则两个结点之间没有边相连;如果a和b的差的绝对值小于等于21,则两个点之间有一条长度为a和 b的最小公倍数的无向边相连。


       例如:结点1和结点23之间没有边相连;结点3和结点24之间有一条无向边,长度为24;结点15和结点25之间有一条无向边,长度为75。


       请计算,结点1和结点2021之间惘最短路径长度是多少?


       提示:建议使用计算机编程解决问题。


参考题解:(答案:10266837)


import heapq
from collections import defaultdict
def gcd(a, b):
    if a < b:
        a, b = b, a
    if a % b == 0:
        return b
    else :
        return gcd(b, a%b)
def lcm(a, b):
    return int(a * b / gcd(a, b))
相关文章
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
|
2天前
|
搜索推荐 C++ Python
Python排序算法大PK:归并VS快速,谁才是你的效率之选?
【7月更文挑战第13天】归并排序** 使用分治法,稳定且平均时间复杂度O(n log n),适合保持元素顺序和并行处理。
12 5
|
3天前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
18 4
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现WOA智能鲸鱼优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现WOA智能鲸鱼优化算法优化支持向量机分类模型(SVC算法)项目实战
|
2天前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
9 1
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现SSA智能麻雀搜索算法优化支持向量机回归模型(SVR算法)项目实战
Python实现SSA智能麻雀搜索算法优化支持向量机回归模型(SVR算法)项目实战
|
21天前
|
存储 机器学习/深度学习 算法
Python算法基础教程
Python算法基础教程
12 0
|
数据采集 SQL 算法
C++、Python、数据结构与算法、计算机基础、数据库教程汇总!
C++、Python、数据结构与算法、计算机基础、数据库教程汇总!
195 0
C++、Python、数据结构与算法、计算机基础、数据库教程汇总!