返回顶部
首页 > 资讯 > 后端开发 > Python >Python最短路径的求解方式有哪些
  • 679
分享到

Python最短路径的求解方式有哪些

2023-06-30 03:06:43 679人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python最短路径的求解方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python最短路径的求解方式有哪些”文章能帮助大家解决问题。前置知识图的话可以大致分为有向图与无

这篇文章主要介绍“python最短路径的求解方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python最短路径的求解方式有哪些”文章能帮助大家解决问题。

前置知识

图的话可以大致分为有向图与无向图、图中的边有的是正权值,有的是负权值
有的是两点之间多条路,有的甚至有自环(可以说是灰常的灵活)
创建一个图可以用的数据结构有:
十字链表、邻接多重表、邻接矩阵、边集数组、邻接表
本篇博客前两题解题方法使用的是邻接表,最后一个使用的是邻接矩阵
大家根据自己的喜好进行选择即可,但是思想还是一样的
如果大家对最短路不是很熟的话,推荐大家去看看这个UP主的视频,感觉讲的贼好传送门已就绪

十字链表:是有向图存储的一种链式存储结构,可以看成是有向图的邻接表和逆邻接表合起来得到的链表。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。

Python最短路径的求解方式有哪些

邻接多重表:邻接多重表是无向图的一种存储方式。邻接多重表是邻接表的改进,它把边的两个顶点存放在边表结点中,所有依附于同一个顶点的边串联在同一链表中,由于每条边依附于两个顶点,则每个边表结点同时链接在两个链表中

Python最短路径的求解方式有哪些

邻接矩阵:是表示顶点之间相邻关系的矩阵(个人感觉也是最简单的一个,但非常不适合稀疏图)逻辑结构分为两部分:V和E集合,其中,V是顶点,E是边。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵

Python最短路径的求解方式有哪些

边集数组:边集数组(edgeset array)是利用一维数组存储图中所有边的一种图的表示方法。该数组中所含元素的个数要大于等于图中边的条数,每个元素用来存储一条边的起点、终点(对于无向图,可选定边的任一端点为起点或终点)和权(若有的话),各边在数组中的次序可任意安排,也可根据具体要求而定。

Python最短路径的求解方式有哪些

练习题

【单源最短路&迪杰斯特拉】畅通工程

问题描述

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,
都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1

问题分析

本题目中求解的是单源最短路,经过观察路的边权均是正的,所以我们暂定使用迪杰斯特拉算法
回顾一下迪杰斯特拉算法的模板步骤:

① 设置一个最短距离数组dis(存储某点到任一点的最短距离)
一个父节点数组pre(最短距离访问该节点需要首先访问的那个节点)
一个标记某点是否找到了最短路的列表visit
一个图(可以使用邻接多重表将边初始化进图G)
② 将出发点初始化一下
③ 选出没有被确定最短路的点中,距离源点最近的点
④ 使用他的边集优化边中点的最短距离
⑤ 将该点加入已找到最短路的数组

代码实现

n,m=map(int,input().split())visit=[False]*(n+1)dis=[1e8]*(n+1)side=[list(map(int,input().split())) for i in range(m)]G={k:[] for k in range(n)}# s是起点e是终点s,e=map(int,input().split())# 初始化邻接表for i in side:    G[i[0]].append([i[1],i[2]])    G[i[1]].append([i[0],i[2]])dis[s]=0for _ in range(n):    mi=1e8    for i in range(1,len(dis)):        if dis[i]<mi and not visit[i]:            mi=dis[i]            s=i    for i in G[s]:        if dis[i[0]]>dis[s]+i[1]:            dis[i[0]]=dis[s]+i[1]    visit[s]=True            print(dis[e])

【单源最短路 & spfa】最短路径

问题描述

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。
输入格式
第一行两个整数n, m。
接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。
输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定
对于10%的数据,n = 2,m = 2。
对于30%的数据,n <= 5,m <= 10。
对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

问题分析

spfa是一种随机方法,有些数据可能会将其卡死。他的思想是使用队列进行算法优化
特点是可以求含有负边权图的最短路。每次将更新过最短长度的点加入队列中(因为该点最短路更新了那么与他相连的点最短路也可能更新)然后从队列中每次取出一个点,对该点所连的点进行边权更新。然后将更新后的点再加入队列中,直到没有点更新为止。

代码实现

def spfa(n):    # 存储修改过最短路权的点    t=[]    t.append(n)    visit[n]=1    while t:        # 每次获取一个更新过路权的点        temp=t.pop()        # 更新与他相连点的路权        for i in G[temp]:            if dis[i[0]]>dis[temp]+i[1]:                dis[i[0]]=dis[temp]+i[1]                # 被更新过点所连得点也需要更新,所以将该点加入临时队列                if visit[i[0]]==0:                    visit[i[0]]=1                    t.append(i[0])n,m=map(int,input().split())ls=[list(map(int,input().split())) for i in range(m)]G={k:[] for k in range(1,n+1)}for i in ls:    G[i[0]].append([i[1],i[2]])visit=[0]*(n+1)dis=[1e8]*(n+1)dis[1]=0spfa(1)print(dis)

【多源最短路 & 弗洛伊德】牛牛聚会

问题描述

给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,
并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,
从这些最短时间里找出一个最大值输出
Input
Line 1: Three space-separated integers, respectively: N, M, and X
Lines 2&hellip; M+1: Line i+1 describes road i with three space-separated integers:
ai, Bi, and Ti. The described road runs from farm Ai to farm Bi, requiring Ti time units to traverse.
Output
Line 1: One integer: the maximum of time any one cow must walk.
Examples
Sample Input
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
Sample Output
10

问题分析

不妨先回忆一下怎么使用弗洛伊德算法:

① 构造两个图G(用于存储边权) P(用于存储父节点或者说用于存储先驱节点)
② 三层循环,判断两点之间最短路是否需要加边
得到的最短路放在G列表中
得到的最短路路径放在P数组中

代码实现

def F(n):    for i in range(1,n+1):        for j in range(1,n+1):            for k in range(1,n+1):                if G[i][j]>G[i][k]+G[k][j]:                    G[i][j]=G[i][k]+G[k][j]                    P[i][j]=kn,m,x=map(int,input().split())G=[[1e7 if i!=j else 0 for i in range(n+1)] for j in range(n+1)]P=[[-1 if i==j else i  for i in range(n+1)] for j in range(n+1)]ls=[list(map(int,input().split())) for i in range(m)]for i in ls:    G[i[0]][i[1]]=i[2]F(n)for i in G:    print(i)for i in P:    print(i)ans=[]for i in range(1,n+1):    if i==x:        continue    if G[i][x]!=1e7 and G[x][i]!=1e7:        ans.append(G[i][x]+G[x][i])print(ans)print(max(ans))

关于“Python最短路径的求解方式有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Python最短路径的求解方式有哪些

本文链接: https://lsjlt.com/news/327205.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python最短路径的求解方式有哪些
    这篇文章主要介绍“Python最短路径的求解方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python最短路径的求解方式有哪些”文章能帮助大家解决问题。前置知识图的话可以大致分为有向图与无...
    99+
    2023-06-30
  • Python 最短路径的几种求解方式
    目录...
    99+
    2024-04-02
  • python中有哪些最短路径算法
    这期内容当中小编将会给大家带来有关python中有哪些最短路径算法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、Bellman-Ford 算法Bellman-Ford算法用于求解单源最短路径问题。算法...
    99+
    2023-06-15
  • Python实现最短路径问题的方法
    目录一、创建图二、问题来源三、Dijkstra算法四、Floyd算法五、代码测试一、创建图 在开始之前,我们先创建一个图,使用邻接矩阵表示有向网: class Graph(obj...
    99+
    2024-04-02
  • python中怎么利用Dijkstra算法求最短路径
    python中怎么利用Dijkstra算法求最短路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  从某源点到其余各顶点的最短路径  Dijkstra算法可用...
    99+
    2023-06-02
  • 【路径规划】(2) A* 算法求解最短路,附python完整代码
    大家好,今天和各位分享一下机器人路径规划中非常经典的 A* 算法,感兴趣的点个关注,文末有 python 代码,那我么开始吧。 1. 算法介绍 A* 算法是 1968 年 P.E.Hart[1]等人所提出的在全局地图环境中所有已知情形下求...
    99+
    2023-10-18
    python A star 路径规划 机器人运动 路径选择
  • Python和Matlab怎么实现蚂蚁群算法求解最短路径
    这篇文章主要介绍“Python和Matlab怎么实现蚂蚁群算法求解最短路径”,在日常操作中,相信很多人在Python和Matlab怎么实现蚂蚁群算法求解最短路径问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”P...
    99+
    2023-06-29
  • Java利用遗传算法求解最短路径问题
    目录1、问题描述2、编码3、个体类4、遗传算法解决最短路径问题主方法5、适应度6、选择算子7、交叉算子8、变异算子9、总结遗传算法(Genetic Algorithm,GA)最早是由...
    99+
    2024-04-02
  • Java如何利用遗传算法求解最短路径
    这篇“Java如何利用遗传算法求解最短路径”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何利用遗传算法求解最短路径...
    99+
    2023-07-01
  • Python&Matlab实现蚂蚁群算法求解最短路径问题的示例
    目录1 知识点 1.1 蚁群算法步骤1.2 蚁群算法程序2 蚂蚁算法求解最短路径问题——Python实现2.1 源码实现2.2&...
    99+
    2024-04-02
  • Java利用Dijkstra算法求解拓扑关系最短路径
    目录算法简介代码实现思路算法思想 代码示例算法简介 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶...
    99+
    2024-04-02
  • python3实现无权最短路径的方法
    问题描述 现有一个有向无权图。如下图所示:   问题:使用某个顶点s作为输入参数,找出从s到所有其他顶点的最短路径。 说明:因为是无权图,因此我们可以为每台边赋值为...
    99+
    2024-04-02
  • 怎么使用c语言动态规划求解最短路径
    在C语言中使用动态规划求解最短路径,可以按照以下步骤进行:1. 定义一个二维数组来表示图中各个节点之间的距离。假设有n个节点,则可以...
    99+
    2023-08-18
    c语言
  • python中最短路径问题的示例分析
    小编给大家分享一下python中最短路径问题的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明最短路径问题是图论研究中的经典算法问题,用于计算从一个顶点到另一个顶点的最短路径。最短路径问题有几种形式:确定起点的最...
    99+
    2023-06-20
  • Java获取项目路径的方式有哪些
    获取项目路径的方式有以下几种:1. 使用System.getProperty("user.dir")方法获取当前工作目录的绝对路径。...
    99+
    2023-08-18
    Java
  • Java利用Dijkstra和Floyd分别求取图的最短路径
    目录1 最短路径的概述2 杰斯特拉(Dijkstra)算法2.1 原理2.2 案例分析3 弗洛伊德(Floyd)算法3.1 原理3.2 案例分析4 邻接矩阵加权图实现5 邻接表加权图...
    99+
    2024-04-02
  • python中路径的写法有哪些
    这篇文章主要介绍了python中路径的写法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中路径的写法有哪些文章都会有所收获,下面我们一起来看看吧。路径的三种写法+路径前符号含义os.path....
    99+
    2023-07-05
  • Java如何利用Dijkstra和Floyd分别求取图的最短路径
    小编给大家分享一下Java如何利用Dijkstra和Floyd分别求取图的最短路径,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 最短路径的概述在生活中,图形结...
    99+
    2023-06-29
  • C++ Dijkstra算法之求图中任意两顶点的最短路径
    Dijkstra算法是图中找任意两点中最短路径的一种经典算法。 重点的步骤总结如下: 1.算法采用了并查集 (之后都叫它为 最短路径顶点集 ):即每次都找离开始顶点距离最短的顶点...
    99+
    2024-04-02
  • ASP 接口路径缓存的实现方式有哪些?
    在 ASP 开发中,缓存是提高性能的重要手段之一。而接口路径缓存则是缓存中的一个重要方面,对于提高网站的性能和用户体验起到了至关重要的作用。那么,ASP 接口路径缓存的实现方式有哪些呢?本文将为您进行详细的介绍。 一、什么是接口路径缓存?...
    99+
    2023-08-29
    接口 path 缓存
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作