博客
关于我
图解:最短路径之迪杰斯特拉算法
阅读量:681 次
发布时间:2019-03-16

本文共 1988 字,大约阅读时间需要 6 分钟。

迪杰斯特拉算法(Dijkstra's Algorithm)是一种单源最短路径算法,旨在找出从指定源点到图中所有其他顶点的最短路径。以下是对该算法的详细解释和实现。

基础概念

在图论中,源点是指路径的起始顶点,而终点则是路径的结束顶点。任何图中的顶点都可以作为源点或终点,具体取决于所考察的路径。最短路径则是指连接源点和终点的边最少的路径。

最短路径的用途

在实际生活中,最短路径问题无处不在。例如,规划从大兴机场到北京天安门的路线,或者使用导航系统进行路线规划,这些都依赖于最短路径算法。迪杰斯特拉算法是这些系统的基础之一。

迪杰斯特拉算法介绍

迪杰斯特拉算法的核心思想是通过不断更新顶点到源点的最短路径,逐步找到所有顶点的最短路径。具体步骤如下:

  • 初始化辅助向量D和路径向量P:

    • D数组存储从源点到各顶点的当前已知最短路径长度。
    • P数组记录从源点到各顶点的路径下标。
    • final数组用于标记顶点是否已找到最短路径。
  • 开始主循环:

    • 每次从优先队列中取出当前已知最短路径最小的顶点u。
    • 遍历顶点u的所有邻接顶点v,并检查是否存在更短的路径。
    • 如果发现更短路径,更新D和P数组,并将新路径加入优先队列。
  • 算法优化

    为了提高效率,迪杰斯特拉算法可以采用小顶堆优化。具体实现如下:

    #include 
    #include
    #include
    using namespace std;typedef pair
    iPair;class Graph { int V; list
    > *adj;public: Graph(int V) { this->V = V; adj = new list
    [V]; } void addEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } void shortestPath(int src) { vector
    dist(V, INF); priority_queue
    , greater
    > pq; dist[src] = 0; pq.push(make_pair(0, src)); while (!pq.empty()) { int u = pq.top().second; pq.pop(); for (auto i = adj[u].begin(); i != adj[u].end(); ++i) { int v = (*i).first; int weight = (*i).second; if (dist[v] > dist[u] + weight) { dist[v] = dist[u] + weight; pq.push(make_pair(dist[v], v)); } } } // 输出结果 printf("Vertex Distance from Source\n"); for (int i = 0; i < V; ++i) { printf("%d \t\t %d\n", i, dist[i]); } }};int main() { int V = 9; Graph g(V); g.addEdge(0, 1, 1); g.addEdge(0, 2, 5); g.addEdge(1, 2, 3); g.addEdge(1, 4, 5); g.addEdge(1, 3, 7); g.addEdge(2, 4, 1); g.addEdge(2, 5, 7); g.addEdge(3, 4, 2); g.addEdge(3, 6, 3); g.addEdge(4, 5, 3); g.addEdge(4, 6, 6); g.addEdge(4, 7, 9); g.addEdge(5, 7, 5); g.addEdge(6, 7, 2); g.addEdge(6, 8, 7); g.addEdge(7, 8, 4); g.shortestPath(0); return 0;}

    时间复杂度分析

    • 初始化阶段:时间复杂度为O(V)。
    • 主循环:外层循环执行V-1次,内层循环执行V次,总体时间复杂度为O(V log V)。
    • 优化版:使用小顶堆后,时间复杂度降为O((V + E) log V),其中E为图的边数。

    总结

    迪杰斯特拉算法是解决单源最短路径问题的经典算法。通过不断更新和优化,最短路径可以在较短的时间内找到。对于更复杂的图,可以结合其他算法如Floyd-Warshall算法,进一步提升性能。

    转载地址:http://jvqqz.baihongyu.com/

    你可能感兴趣的文章
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>
    python 学习 面向对象编程
    查看>>
    Python 学习日记第三篇 -- 字典
    查看>>
    Python 学习笔记(一)Data type
    查看>>
    python 安装echarts
    查看>>
    python 安装opencv及问题解决
    查看>>
    Python 安装程序:“写入文件 C:\Python27\pythonw.exe 时出错“
    查看>>
    Python 安装避坑指南:从入门到进阶
    查看>>
    Python 安装配置详解
    查看>>
    python 实现儿童算术游戏
    查看>>
    python 实现字符串转整型
    查看>>
    Python 实现定时任务的八种方案!
    查看>>
    Python 实现自动化测试 dubbo 协议接口
    查看>>
    python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
    查看>>
    Python 对mysql数据库的操作
    查看>>
    Python 对象数据库列表
    查看>>
    Python 导入requests报错No module named requests
    查看>>
    python 将函数加到列表中进行调用
    查看>>
    python 将图片与字符串相互转换
    查看>>