当前位置: 首页 > news >正文

C++ Dijkstra堆优化算法

时间复杂度为:O((n+m)logn)

算法特点:非负边权、单源最短路、顶点数、边数<1000000,数据结构前置:领接表、哈希表、二叉堆

算法:

第一步,建图,任何算法我们都要去思考,用什么数据结构来存储,这个算法我们采用邻接表来存储,有时候输入数据,并不是我们期待的那样,所以需要对图进行一些处理,这就是建图的过程

第二步,辅助数组,对于图G = <V, E>,源点为s,dist[i]表示s到i的最短路,visited[i] 表示dist[i]是否已经确定(布尔值),即s到i的最短路,是否已经确定。

第三步,辅助堆,利用一个小顶堆heap存放二元组(v, dist[v]),小顶堆扮演的是优先队列作用,dist[v]值越小的,会从优先队列中优先出列。

第四步,初始化,初始化所有顶点的数据见下,

dist[i] = 无穷大(0 =< i =< n)

visited[i] = false

dist[s] = 0

heap.push(s, dist[s])

第五步,找距离最小的点,从小顶堆中不断弹出元素u,并且判断visited[u]是否为true,如果为true,则继续弹出;否则标记为true,并且从u出发,进行松弛操作,如果堆为空,算法结束。

第六步,松弛操作,更新从u出发,到达顶点v的最短路dist[v],

dist[v] = min(dist[v], dist[u] + w(u, v))

代码分析:第一步,定义距离二元组 Dist(v, w)

第二步,初始化邻接表

function initEdges(n, edges[maxn])

  for i -> (0, n-1)

    edges[i] = {}

第三步,邻接表加边,

function addEdge(edges[maxn], u, v, w)

  edges[u].append(Dist(v, w))

第四步,建图

addEdge(edges, u1, v1, w1)

addEdge(edges, u2, v2, w2)

...

第五步,框架代码

function DijkstraHeap(n, st, edges[maxn], d[maxn])

  heap = Heap()

  visited[maxn] = false

  dijkstraInit(n, st, heap, visited, d)

  while(not heap.empty())

    u = dijkstraFindMin(heap)

    dijkstraUpdate(u, edges, heap, visited, d)

第六步,初始化

function dijkstrainit(n, st, heap, visited[maxn][maxn])

  for i->(0, n-1)

    d[i] = inf

    visited[i] = false

  dist[st] = 0

  heap.push(Dist(st, d[st]))

第七步,获取最小值

function dijkstraFindMin(heap)

  s = heap.top()

  heap.pop()

  return s.v

第八步,松弛操作

function dijkstraUpdate(u, edges[maxn], heap, visited[maxn], d[maxn])

  if not visited[u]

    visited[u] = true

    for i-> (0, edges[u].size() - 1)

      v = edges[u][i].v

      w = edges[u][i].w

      if (d[u] + w < d[v])

         d[v] = d[u] + w

         heap.push(Dist(v, d[v]))

代码练习,对应蓝桥云课 Dijkstra求最短路2 代码见下

#include <iostream>
#include <vector>
#include <queue>using namespace std;#define inf 1000000001
#define maxn 100001
#define ValueType intstruct Dist{int v;ValueType w;Dist() {}Dist(int _v, ValueType _w): v(_v), w(_w) {}bool operator < (const Dist& d) const{return w > d.w;}
};typedef priority_queue<Dist> Heap;void addEdge(vector<Dist>* edges, int u, int v, ValueType w){edges[u].push_back(Dist(v, w));
}void dijkstraInit(int n, int st, Heap& heap, bool *visited, ValueType* d){for(int i=0; i<n; ++i){d[i] = inf;visited[i] = false;}d[st] = 0;heap.push(Dist(st, d[st]));
}int dijkstraFindMin(Heap& heap){Dist s = heap.top();heap.pop();return s.v;
}void dijkstraUpdate(int u, vector<Dist>* edges, Heap& heap, bool *visited, ValueType* d){if(visited[u]){return;}visited[u] = true;for(int i=0; i<edges[u].size(); ++i){int v = edges[u][i].v;ValueType w = edges[u][i].w;if(d[u] + w < d[v]){d[v] = d[u] + w;heap.push(Dist(v, d[v]));}}
}void DijkstraHeap(int n, int st, vector<Dist>* edges, ValueType* d){Heap heap;bool visited[maxn] = {false};dijkstraInit(n, st, heap, visited, d);while(!heap.empty()){int u = dijkstraFindMin(heap);dijkstraUpdate(u, edges, heap, visited, d);}}vector<Dist> edges[maxn];
ValueType d[maxn];int main()
{int n, m;cin >> n >> m;while(m--){int u, v, w;cin >> u >> v >> w;--u, --v;addEdge(edges, u, v, w);}DijkstraHeap(n, 0, edges, d);if(d[n-1] == inf){cout << -1 << endl;}else{cout << d[n-1] << endl;}// 请在此输入您的代码return 0;
}

  代码练习 2 对应蓝桥云课 蓝桥王国 代码见下

#include <iostream>
#include <vector>
#include <queue>using namespace std;#define inf 1000000001000000001
#define maxn 300001
#define ValueType long long struct Dist{int v;ValueType w;Dist() {}Dist(int _v, ValueType _w): v(_v), w(_w) {}bool operator < (const Dist& d) const{return w > d.w;}
};typedef priority_queue<Dist> Heap;void addEdge(vector<Dist>* edges, int u, int v, ValueType w){edges[u].push_back(Dist(v, w));
}void dijkstraInit(int n, int st, Heap& heap, bool *visited, ValueType* d){for(int i=0; i<n; ++i){d[i] = inf;visited[i] = false;}d[st] = 0;heap.push(Dist(st, d[st]));
}int dijkstraFindMin(Heap& heap){Dist s = heap.top();heap.pop();return s.v;
}void dijkstraUpdate(int u, vector<Dist>* edges, Heap& heap, bool *visited, ValueType* d){if(visited[u]){return;}visited[u] = true;for(int i=0; i<edges[u].size(); ++i){int v = edges[u][i].v;ValueType w = edges[u][i].w;if(d[u] + w < d[v]){d[v] = d[u] + w;heap.push(Dist(v, d[v]));}}
}void DijkstraHeap(int n, int st, vector<Dist>* edges, ValueType* d){Heap heap;bool visited[maxn] = {false};dijkstraInit(n, st, heap, visited, d);while(!heap.empty()){int u = dijkstraFindMin(heap);dijkstraUpdate(u, edges, heap, visited, d);}}vector<Dist> edges[maxn];
ValueType d[maxn];int main(){int n, m;cin >> n >> m;for(int i=0; i<m; ++i){int u, v, w;cin >> u >> v >> w;--u, --v;addEdge(edges, u, v, w);}DijkstraHeap(n, 0, edges, d);for(int i=0; i<n; ++i){if(i){cout << " ";}if(d[i] == inf){cout << "-1";}else{cout << d[i];}}cout << endl;return 0;
}


文章转载自:

http://PrIPJovo.pjftk.cn
http://2l8atS5i.pjftk.cn
http://IDgCDrej.pjftk.cn
http://raFzkWJ7.pjftk.cn
http://8Mj6VlbK.pjftk.cn
http://N8MGGJ2v.pjftk.cn
http://Y3GtETOF.pjftk.cn
http://7qdGoCTz.pjftk.cn
http://4FxEu223.pjftk.cn
http://kTfYUXEW.pjftk.cn
http://yZRbK4LE.pjftk.cn
http://kGMBcr8g.pjftk.cn
http://WGWAYwvp.pjftk.cn
http://1wqLOshH.pjftk.cn
http://7EKyuZOx.pjftk.cn
http://AClq5bDo.pjftk.cn
http://yYw6Wmrc.pjftk.cn
http://P7tXG6Qg.pjftk.cn
http://RfOsbjGY.pjftk.cn
http://PWYYR1S2.pjftk.cn
http://agZTRRup.pjftk.cn
http://rNOeNEBZ.pjftk.cn
http://hMmF5gv8.pjftk.cn
http://UPII7HsW.pjftk.cn
http://T5Zll0tK.pjftk.cn
http://Rq1YI3Ja.pjftk.cn
http://r8m26cSd.pjftk.cn
http://YPnArlaZ.pjftk.cn
http://91whds4z.pjftk.cn
http://aMhKNQUG.pjftk.cn
http://www.dtcms.com/a/379954.html

相关文章:

  • python编程原子化多智能体综合编程应用(下)
  • 国标GB28181视频EasyGBS视频监控平台:一网联全城,交通道路可视化、视频巡检、应急指挥“三合一”。
  • 【React】React 哲学
  • 项目日志输出配置总结(多数据源MyBatis+Logback)
  • LabVIEW滚筒洗衣机测试
  • 英语核心语法点详解:“To”作为介词、不定式与固定搭配的辨析与运用
  • 设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
  • Vivado SDK 中 XScuGic(ARM Cortex-A9 SCU GIC 中断控制器)相关函数
  • 【学习K230-例程21】GT6700-UDP-Client
  • 考研408计算机网络近年第34题真题解析(2021-2024.34)
  • 安装vcenter6.7 第二阶段安装很慢 或卡在50%
  • 《赛事报名系统小程序》
  • 倍福PLC常见问题
  • 课前准备--解析空间转录组肿瘤微环境SNV(visium、stereo)
  • Linux下C语言实现HTTP+SQLite3电子元器件查询系统
  • 第四节 JavaScript——深入变量、作用域与内存管理
  • 淘客返利app后端系统架构设计:从数据一致性到高可用方案
  • 自动清除ROS日志方法汇总
  • GitHub 上整合深度学习 + 遥感数据集(或工具库/benchmark)的项目
  • 学习日记-JS+DOM-day54-9.12
  • 数据分析毕业论文题目推荐:精选选题清单
  • Apache Flink 从流处理基础到恰好一次语义
  • 第2篇:数据持久化实战
  • redis sentinel 与 clauster 的区别
  • Vue: 侦听器(Watch)
  • HTML 设计与使用入门
  • 【大数据专栏】流式处理框架-Apache Fink
  • 老项目CSS样式失效?调整css插件版本解决
  • Flink 实时流处理实战:电商实时大屏分析
  • ARM(7)IMX6ULL 按键控制(轮询 + 中断)优化工程