最短路径

C++算法之——常用算法总结

泄露秘密 提交于 2019-11-27 14:25:43
http://blog.sina.com.cn/s/blog_61bebe480100v7c7.html 基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以及 贪心算法。 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。 一、排序算法 1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数) 冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间 选择排序:一般针对数组、本地排序、需要交换数据。O(1)的额外空间 插入排序:可以是针对数组的本地排序,此时需要移动大片数据,但是比较次数是O(N*logN)。如果是针对链表,比较次数是O(N^2),但是不需要交换数据。 注意:一般排序都是针对数组的本地排序,数组与链表相比,可以随机访问,空间使用效率更高(链表需要存放指针),而链表一般对于插入与删除操作有更好的性能。 2. O(N*logN)算法 快速排序:针对数组的本地排序,时间复杂度平均O(N*logN),最坏时O(N^2)。空间复杂度O(1) 归并排序:可以针对数组,也可以针对链表。针对数组时时间复杂度为O(N*logN),空间复杂度为O(N) 3. 堆排序 1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 (Robert W.Floyd)和威廉姆斯(J

最短路径树

寵の児 提交于 2019-11-27 12:52:51
一.概述 首先我们先搞清楚什么最短路径树,我们这里可以引申三个概念,最短路径,最短路径树,最小生成树 最短路径 :最短路径就是指两点之间的最短距离,通常算法有dij,spfa,floyed 最短路径树 :概念就是以一个节点为根,然后根节点到其他所有点的距离最短,然后形成了一棵树,把不必要的边删除,其实我们用dij的时候求一个点到其他点的距离的时候就已经会把根节点到其他所有点的最短距离求出来了,只是我们不确定是哪些边构成的 最小生成树 :没有根的概念,就是用最小的花费保证所有点直接或者间接联通 这里我来盗用大佬的图好理解一下 原图: 最短路径树 最小生成树 二.做法 我们一般可以怎么来写呢 第一种: 我们用dij求出最短路径,我们已经知道建造整颗最短路径树的花费,然后我们去枚举每一条边,假设把这条边删掉,如果最小花费有影响,说明这个肯定是最短路径树上的边,相等的情况要处理一下,复杂度是O(nlogn*nlogn) 第二种: 显然第一种复杂度太高了,一点都不现实,所以我们一般使用第二种方法,我们还是一样先求一遍dij,然后我们知道根节点到其他点的距离,我们dfs一遍,如果dis[v]=dis[u]+w,说明这条边可以充当最短路径树上的边,换上并且没有影响,或者我们直接枚举每一条边,判断这个条件也可以,看题目不同的需求下要处理什么 三.例题巩固 Description

Dijstra算法

你。 提交于 2019-11-27 08:08:50
一、算法步骤 1.给顶点v1标P标号,从出发点v1到终点v1的距离为d(v1)=0,给和被P标号标记的顶点相连的顶点标T标号,d(vi)=L1-j 2.在所有T标号中取最小值,把拥有最小值的T标号标记为P标号,重新生成所有T标记,新生成的T标记重新计算路径d 3.重复以上操作,直到所有顶点达到目标顶点,选取最短路径。 二、算法思想 1.首先假设目标顶点是顶点v,v可以是任意一个顶点 2.其次每一次迭代都可以认为是在寻找到达任意一个顶点的最小值(只要是还没有被标记过的顶点) 3.为什么该算法可以找到两点之间的最短路径,为什么标记过的点不再考虑 (1)首先说明我们遍历了到达各个顶点的所有最短路径 (2)我们考虑一般步骤,v5标记为P标记,路径为v1…v5,现在同样有任意一条路径v1…v7路径,这两条路径没有交集,这个时候v1-5<v1-7,继续下一步,假如v7的下一个节点是v5,v1-5<v1-7<v1-7+v7-5。 三、算法程序 程序: tulun1.m weight= [0 2 8 1 Inf Inf Inf Inf Inf Inf Inf; 2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf; 8 6 0 7 5 1 2 Inf Inf Inf Inf; 1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf; Inf 1 5 Inf 0 3

最短路详解

自闭症网瘾萝莉.ら 提交于 2019-11-27 05:04:18
最短路问题是图论中最基础的内容,在考试中也常常看到关于最短路的问题或模型。 最短路问题,即在一个图中,寻找两个节点之间的最短路径的问题。最短路问题分为单源最短路径问题(SSSP问题)和多源最短路径问题,在本文中会一一进行讲解。 在讲解最短路问题前,先补充几个知识点: 存图的方法:常见的存图方法有邻接表和邻接矩阵,设该图有$n$个节点,$m$条边,则邻接表的空间复杂度为$O(n+m)$ ,邻接矩阵的空间复杂度为$O(n^2)$ ,读者在题目中可以根据题目要求选择一种方法进行存图。关于具体操作可以参考各类信息学奥赛入门书籍,在本文中接下来亦会讲解。 优先队列(priority_queue):在C++STL中提供的一种数据结构,其内部实际是一个大根堆,功能与大根堆基本相同,需调用头文件<queue>。 二元组:C++提供一个二元组的定义与操作,其中: pair<类型a,类型b>:定义一个二元组类型,第一维和第二维的变量类型分别为$a,b$ make_pair(x,y) a:定义一个新的二元组a,类型为先前定义的二元组类型,第一维和第二维的值分别为$x,y$ a.first:取出二元组a的第一维的值 a.second:取出二元组a的第二维的值 单源最短路径(SSSP)问题 SSSP问题的基本模型为:给定一个起点s,找到s到图中其它所有节点的最短路径长度。在本文中, d[i] d [ i ]

求最短路径以及记录路径输出 wzy的大冒险——出发咯QAQ

萝らか妹 提交于 2019-11-27 02:47:29
wzy的大冒险——出发咯QAQ 单点时限: 2.0 sec 内存限制: 512 MB wzy踏上了冒险的旅程。 现在他从地精手里买了一份地图,地图上有n个城镇。 他从第一个城镇出发,走向(没钱只能走)第n个城镇,现在,请你帮wzy找到一条最短的路径,并倒序(从n到1)输出一条最短路径。 举个栗子:如果有两条路径6 4 3 1和6 5 2 1,我们选择6 4 3 1这条。 地精小提示:路是单向的QAQ。 输入格式 第一行两个数n,m ,(1≤n≤103,1≤m≤103) 接下来m行,每行三个数x,y,z,表示点 x 与点 y 之间有一条权值为 z 的有向边 (1≤x,y,z≤103). 输出格式 第一行一个整数表示 1 到 n 的最短距离; 第二行倒序输出这条路径。 样例 input 5 7 1 2 69 1 3 87 1 4 79 2 5 94 2 3 10 3 5 79 4 5 43 output 122 5 4 1 关键是利用d【maxn】数组去保存路径 然后进行输出 以及一些存图操作 #include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int maxn=1e3+10; typedef long long ll; int way[maxn][maxn]; int dis

算法学习(1):最短路径—Dijkstra算法和Floyd算法

血红的双手。 提交于 2019-11-27 02:09:53
从某顶点出发,沿图的边到达另一顶点所经过的路径中, 各边上权值之和最小的一条路径——最短路径。 解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法,本文研究的是floyd算法和dij算法。 一.Floyd算法 1.定义概览 Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。算法的时间复杂度为O(N 3 ),空间复杂度为O(N 2 )。 2.算法描述 1)算法思想原理: 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

最短路径算法(Dijkstra)

瘦欲@ 提交于 2019-11-27 01:26:20
1、建立矩阵,记录任意两点间的直接距离; 2、两个集合,一个集合记录到每个点的最短路径,一个记录前驱节点; 3、主循环,每次找当前点与其他点的距离,记录下最短距离和前驱节点,然后看看通过前驱节点和最短路径是否更近,修正最短路径和前驱节点。 转载于:https://www.cnblogs.com/nzbbody/p/3339296.html 来源: https://blog.csdn.net/weixin_30268071/article/details/99234441

Dijkstra最短路径算法

雨燕双飞 提交于 2019-11-27 01:23:52
1、现讲最优子结构性质,所谓的最有子结构性质是指:一个问题的最优解包含子问题的最优解。最短路径满足最优子结构。MinPath(i,j)表示i与j之间的最短路径。假如MinPath(i,j)={Vi...Vk...Vs...Vj},则MinPath(k,s)={Vk...Vs}。反证法很容易证明:如果MinPath(k,s)≠{Vk...Vs},说明存在一个更短的路径,那么{Vi...Vk...Vs...Vj}也不是最短路径,这与已知条件矛盾。 2、思路:Dijkstra最短路径算法满足最优子结构性质,因此每个点只需要知道自己的前驱节点,逆序排一下,就知道了路上的节点。同时,还要记录最短距离。   需要两个数组,一个数组记录当前情况下源点到每个点的距离,一个数组记录每个点的前驱节点。   首先初始化源点到每个点的直接距离,然后,在当前情况下,找出离源点最近的点,用这个最近的点去更新距离和前驱节点。只能是从源点顺着推导,一步一步扩展,根据当前找到的最短路径的节点,去更新数组:距离数组和前驱节点数组。 转载于:https://www.cnblogs.com/nzbbody/p/3425841.html 来源: https://blog.csdn.net/weixin_30709929/article/details/99234510

数据--第45课 - 最短路径

走远了吗. 提交于 2019-11-27 00:06:28
第45课 - 最短路径 1. 最短路径 如果从有向图中某一顶点(称为源点)到达零一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 问题解决: 单源最短路径问题:Dijkstra算法。 所有顶点之间的最短路径:Floyd算法。 2. 问题分析 问题的提法:给定一个带权有向D与源点v,求从v到D中其它顶点的最短路径。限定各边上的权值大于0。 解决思路:Dijkstra提出按路径长度的递增次序,逐步产生最短路径的算法。首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,以此类推,直到从顶点v到其它各顶点的最短路径全部求出为止。 3. 解决步骤描述 设置辅助数组dist。它的每一个分量dist[i]表示当前找到的从源点v 0 到终点v i 最短路径的长度。 初始状态:若从源点v 0 到顶点v i 有边:dist[i]为该边上的权值。 若从源点v 0 到顶点v i 无边:dist[i]为无穷。 (1) 初始化:; dist[j] Edge[0][j],j = 1,2,...,n-1; 找出最短路径所对应的点K: (2) dist[k] == min{dist[i]},; ; (3) 对于每一个修改: dist[i] min{dist[i],dist[k]+Edge[k][i]} (4) 判断:若S=V,则算法结束,否则转(2) 4

Dijkstra算法与matlab结果解读

限于喜欢 提交于 2019-11-26 20:07:03
图论 Dijkstra算法与matlab结果解读 可以求出图G中从顶点开始到其余各个顶点的最短路。 在这里不列出复杂的数学公式,只对其原理和使用方式做叙述 原理 Dijkstra算法能够求出顶点到其余各个顶点的最短路径。属于贪心算数 1.首先,选取起点,历经顶点周围的所有路径,先找到最短(权重最小)的一条路,当确定了这条后。 2.历经顶点1,顶点2周围的所有路径,找到下一个到原点最短的点(计算以顶点2为中转点,到各个点的距离和从原点直接出发到各个点的距离,选择到顶点最短路)例如:若A—B的距离小于A—C—B,则第三个点选择B边选择A—B 3.现在已经确定两个定点到所选原点的最短路径了,接下来依次执行2,最终得到一条连通树,虽然树上有不同的分支,但树上的每个定点到原点的路仅有一条(即是最短路) 一篇非常好的图文讲解: https://blog.csdn.net/u013414501/article/details/50506907 上图即求出各个点到原点的最短路径 matlab实现及结果解读 例: 2. 某企业使用一台设备,在每年年初,企业领导部门就要购置新的,还是继续使用旧的。若购置新设备,就要支付一定的购置费用;若继续使用旧设备,则需支付更多的维修费用。现在的问题是如何制定一个几年之内的设备更新计划,使得总的支付被费用最少。以一个五年之内更新某种设备的计划为例