兔兔 的 总结 —— 图论 之 最短路 (未完结)

图论 之 最短路

(读者在学习本博客之前,请先学习 " 图 " 哦~。)

"图论 之 最短路"的目录

  • 图论 之 最短路
    • 一. 回顾
      • 1. 图的储存
      • 2. 图的遍历
    • 二. 最短路
      • 1. 概念
      • 2. F l o y d Floyd Floyd 算法
  • 附: 未完结


一. 回顾

1. 图的储存

让我们来复习一下图的储存:
兔兔 的 总结 —— 图论 之 最短路 (未完结)_第1张图片

2. 图的遍历

  • 深度优先遍历 ( d f s ) (dfs) (dfs)
    访问标记避免重复 v i s [ N ] 、 a d d vis[N]、add vis[N]add_ e d g e ( 起 点 , 终 点 ) edge(起点,终点) edge(,) { G [ v ] . p u s h G[v].push G[v].push _ b a c k ( u ) back(u) back(u);无向反向}
  • 广度优先遍历 ( b f s ) (bfs) (bfs)
    队列、优先队列(字典序)
  • 拓扑排序
    判定有向无环图 ( D A G ) (DAG) (DAG)

二. 最短路

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图 (由结点和路径组成的) 中两结点之间的最短路径。

1. 概念

最短路问题:给出一个带权图,再给出起点和终点,求出起点到终点的最少权值。
求最短路的方法有很多种,兔兔在这里给大家介绍常用的几种:

  • F l o y d Floyd Floyd 算法
  • D i j k s t r a Dijkstra Dijkstra 算法
  • B e l l m a n − F o r d Bellman-Ford BellmanFord 算法

2. F l o y d Floyd Floyd 算法

F l o y d Floyd Floyd 算法的本质就是动态规划:
把中转点当作当前的阶段。
F [ k , i , j ] F[k,i,j] F[k,i,j] 表示:在 i i i j j j 的中转点为标号 1 1 1 ~ k k k 这些点时,从 i i i j j j 的最短路的值
F [ 0 , i , j ] = d i s [ i , j ] F[0,i,j] = dis[i,j] F[0,i,j]=dis[i,j] d i s dis dis 为前面定义的邻接矩阵
F [ k , i , j ] = m i n ( F [ k − 1 , i , j ] F[k,i,j] = min(F[k-1,i,j] F[k,i,j]=min(F[k1,i,j], F [ k − 1 , i , k ] + F [ k − 1 , k , j ] ) F[k-1,i,k]+F[k-1,k,j]) F[k1,i,k]+F[k1,k,j])
k这一维空间可以省略,变成F[i,j]
由于 k k k D P DP DP 的阶段循环,所以 k k k 循环必须要放在最外层
就成为了我们平时常见的 F l o y d Floyd Floyd 算法
F l o y d Floyd Floyd 算法 是最简单,也是容易理解的最短路径算法,可以计算图中任意两点间的最短路径。
时间复杂度为 O ( N 3 ) O(N^3) O(N3),适用于 正 负 边 权 正负边权 的情况。


附: 未完结

  • 兔兔的博客还没有完结哈,请读者们见谅哦~
  • 如果读者有 想 要 作 者 改 进 的 地 方 想要作者改进的地方 或者 想 要 作 者 添 加 的 想要作者添加的 ,请在 评 论 区 留 言 评论区留言 或者 给 兔 兔 私 信 给兔兔私信 哦~

你可能感兴趣的:(数据结构,图论)