最短路径

Python 快速解决图论问题 —— Dijkstra算法

做~自己de王妃 提交于 2020-01-15 21:14:46
Python 快速解决图论问题 —— Dijkstra算法 文章目录 Python 快速解决图论问题 —— Dijkstra算法 使用Dijkstra算法解决单源最短路径问题 1. 导入必要的包和转换数据成图 2. 有向图 3. 无向图 使用Dijkstra算法解决单源最短路径问题 1. 导入必要的包和转换数据成图 import networkx as nx import numpy as np import matplotlib . pyplot as plt inf = 1000 # the max number, it means there is no direct way edge = [ [ 0 , inf , 5 , 30 , inf , inf ] , [ 2 , 0 , inf , inf , 8 , inf ] , [ inf , 15 , 0 , inf , inf , 7 ] , [ inf , inf , inf , 0 , inf , inf ] , [ inf , inf , inf , 4 , 0 , inf ] , [ inf , inf , inf , 10 , 18 , 0 ] ] new_edge = np . array ( edge ) 2. 有向图 # 若G是有向图 G = nx . DiGraph ( ) # 建立一个有向图 l =

队列求解迷宫最短路径

跟風遠走 提交于 2020-01-12 05:35:38
#include <stdio.h> typedef struct {   int x;   int y;   int pre; }Queue; Queue Qu[1000]; int Map[20][20]; int front, rear; int M, N; int aim[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; void Print(int front) {   int j, k;   j = k = front;   j = front;   while(j != 0)   {     j = Qu[k].pre;     Qu[k].pre = -1;     k = j;   }   int ns = 0;   for (int i = 0; i <= front; i++)   {     if (Qu[i].pre == -1)     {       ns++;       printf("(%d, %d)", Qu[i].x, Qu[i].y);       if (ns % 5 == 0)       {         printf("\n");       }     }   } } void FindPath(int sx, int sy, int ex, int ey) {   front = rear

图及其应用

我们两清 提交于 2020-01-11 17:25:40
数据结构(实验C语言版) 图及其应用 一、实验目的 1.掌握图的邻接矩阵、邻接表的表示方法 2.掌握图的遍历 3.掌握图的连通性及有向无环图的应用 二、实验环境 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: VS2010或Visual C++ 6.0或Win-TC等。 三、实验内容 基于Dijsktra算法的最短路径求解: 问题描述:一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。 输入要求: 多组数据,每组数据有m+3行。第一行为两个整数n和m,分别代表城市个数n和路径条数m。第二行有n个字符,代表每个城市的名字。第三行到第m+2行每行有两个字符a和b和一个整数d,代表从城市a到城市b有一条距离为d的路。最后一行为两个字符,代表待求最短路径的城市起点和终点。当n和m都等于0时,输入结束。 输出要求: 每组数据输出两行。第一行为一个整数,为从起点到终点之间最短路的长度。第二行为一串字符串,代表该路径。每两个字符之间用空格隔开。 输入样例 3 3 A B C A B 1 B C 1 C A 3 A C 6 8A A B C D E F A F 100 A E 30 A C 10 B C 5 C D 50 D E 20 E F 60 D F 10 A F

最短路径的Dijkstra算法

房东的猫 提交于 2020-01-11 14:24:30
核心思想:基于已经求出的最短路径的基础上,求得更远顶点的最短路径。 P数组:用来记录前驱顶点,如P[8]=6表示v8的前驱顶点是v6; D数组:D[i]表示vi和v0的最短距离; 在每次大循环内: 1.在D数组中找出当前离v0最近的顶点vk( vk是在所有还未被确定最短路径的顶点中选出。因为已经被确定最短路径的顶点和v0的距离已经是最短的了,而且是必定不会改变的 ),并在flag数组中把下标为k的元素置1; 2.在已经找到v0与vk的最短路径的基础上,对和vk直接相连的且未被确定的顶点进行计算,得到v0与它们的当前距离,并 对D数组、和P数组进行修正 。 大循环结束后,flag数组全为1,表明所有的顶点都完成了最短路径的查找工作,即v0到任何一个顶点的最短路径都已经被求出。 特点:对于每次循环确定的vk,v0与vk的距离是 不断增加 的。 # include <iostream> using namespace std ; # define MAXVEX 9 # define INFINITY 65536 typedef struct { int arc [ MAXVEX ] [ MAXVEX ] ; //邻接矩阵 int numVEXS ; //顶点个数 } MGraph ; void ShortestPath_Dijkstra ( MGraph & G ) ; int main

floyd算法证明

て烟熏妆下的殇ゞ 提交于 2020-01-11 04:37:30
算法介绍 作用:求多源最短路径 核心思想:算法 扫描一遍 n 判断 (A[ i ][ n ]+A[ n ][ j ] ) < A[ i ][ j ] (即判断 i -> j,i点到j点的距离是否小于从n点中转的距离) 如果小则刷新,因此复杂度是n3次方 算法实现 网上有很多参考:https://juejin.im/post/5cc79c93f265da035b61a42e 算法证明 不存在最短路径的场景: 不存在最短路径:存在负权环,理论上可以无穷小(此算法无法解决)。不通,表现为无穷大,两点的最短路径一直会是无穷大,因为没有中间的存在(如果有则两点相通)。 存在最短路径的场景: 存在最短路径,ab之间存在一条或多条最短路径。将ab的路径展开得到最短路径 a c d e f g b(路径可以是多条,但长度是一致); 递归思想:则 c d e f g 一定有一个顶点x(任意一个顶点)是最后刷新,则如果a x 和 x b的最短路径长度已经得到,则ab的最短路径长度则会刷新 此算法就是对的;递归思想 将 ax 划分成a y(y任意一顶点代称) 与yx ,xb 划分为x y 和yb,最后递归的边界为 a i(i任意顶点代称,最短路径a i之间无任何节点),然而ai 因为是最短路径,所以a到i的距离就是最短距离。所以此算法正确。 递推思想:每出现一个顶点 则此顶点的左右都是最短路径

数据结构:最短路径的算法实现

孤人 提交于 2020-01-10 03:08:47
题目: 利用狄克斯特拉(Dijkstra)算法求上图中0结点到其它结点的最短路径,算法实现代码必须有注释。 思路: 采用迪杰斯特拉算法 (1)初始时,S只包含起点vs;U包含除vs外的其他顶点,且U中顶点的距离为"起点vs到该顶点的距离"[例如,U中顶点v的距离为(vs,v)的长度,然后vs和v不相邻,则v的距离为∞]。 (2)从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。 (3)更新U中各个顶点到起点vs的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(vs,v)的距离可能大于(vs,k)+(k,v)的距离。 (4)重复步骤(2)和(3),直到遍历完所有顶点。 代码块: # include "pch.h" # include <iostream> # include <vector> # include <cmath> # include <algorithm> # include <string> using namespace std ; # define MVNum 100 # define INFINITY 65535 typedef char VerTexType ; //顶点数据类型设置为字符 typedef int ArcType ; //边的权值为整型

dijkstra算法和Floyd算法

旧时模样 提交于 2019-12-28 11:33:45
dijkstra算法及其优化 dijkstra算法用来求权值均为非负的单源最短路径算法。 用于计算单个节点到其他节点的最短路。 特点: 以起始点为中心向外层层扩展,直到扩展到终点为止。 本质是贪心算法。 算法思路:(一张图就能概括) 图片来源 不做任何处理的时间复杂度为O(n^2); 代码: 1 int dis[N][N]; 2 int cost[N][N]; 3 int used[M]; 4 int low[M]; 5 int st,end; 6 int n; 7 void Dijkstra() 8 { 9 int i,j; 10 int pos; 11 memset(used,0,sizeof(used)); 12 for(i=1;i<=n;++i)//第一次给low,less赋值 13 { 14 low[i]=dis[st][i];//各点到st的距离 15 } 16 used[st]=1; 17 for(i=1;i<n;++i)//找n-1个点 18 { 19 int min = INF; 20 for(j=1;j<=n;++j)//寻找权值最小的(相当于排序) 21 { 22 if(!used[j]&&min>low[j]) 23 { 24 min=low[j]; 25 pos=j; 26 } 27 } 28 used[pos]=1;//标记flag 29 for(j=1

最短路径_Floyd算法(多源)

回眸只為那壹抹淺笑 提交于 2019-12-27 01:25:26
Floyd算法是一个经典的动态规划算法,它又被称为插点法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,算法目标是寻找从点i到点j的最短路径。 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,算法假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,算法检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。 Floyd算法内容 / /求每队顶点之间的最短路径 //实现这个目的,有2种方式: //1.利用每个顶点为源头,共调用n次Dijstra算法 //2.Floyd算法,上下方案都是o(n^3) //辅助结构 1.二维数组Path[i][j],记录前驱 // 2.二维数组D[i][j],记录最短路径长度 //具体步骤: //初始化:D[i][j]=G.ver[i][j],然后进行(n-1)次比较和更新 //1.在vi和vj之间加入顶点v0,比较(vi,vj

Dijkstra算法(记录路径)

纵饮孤独 提交于 2019-12-26 17:07:52
与求最短路相比,增加一个path数组,来记录最短路的路径 先将path[i]=-1,之后每次找出最短路的点p后将path[j]=p 用path[j]=i表示从i到j最短路的路径 for(int j=1; j<=n; j++){ if(!visited[j] && dis[p]+mapp[p][j]<dis[j]){ dis[j]=dis[p]+mapp[p][j]; path[j]=p; } } 1339: 单源最短路径 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: 3 [ 提交 ][ 状态 ][ 讨论版 ][命题人: 外部导入 ] 题目描述 给定带权有向图G=(V,E),其中每条边的权是非负数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路径长度,这里路径的长度是指路径上各边权之和。这个问题通常称为单源最短路径问题(Single-Source Shortest Paths)。 如下图所示,就是要计算源点V1到其他各个顶点的最短距离,并输出相应的路径。 输入 本题有多组数据,第 1 行有 2 个数据 n 和 m ,其中 n 表示结点的个数, m 表示路径的数目。 接下来有 m 行,每行有 3 个数据 s,t 和 edge ,其中 s 表示路径的起点, t 表示路径的终点, edge 表示该路径的长度。 当 n=0 , m=0 时