Dijkstra记录

材料

  • ①G<V,E> v为节点,E为边,需要知道权重
  • ②array d[v] 原点到节点v的最短路径
  • ③array pai/pre[v] 节点v的前驱节点

算法过程

  • 第一步 初始化 , 原点为s, d[s],为0 ,其余节点 i d[i]无穷
  • 第二步 (存在集合 S 和集合 Q,S+Q=V)
    ①开始: S为 , Q为 V
    ②进行: 选取Q中 距原点最近的 结点u ,从Q移到S。(开始时u为原点)
    u指向的每条边 进行松弛操作,若改进,更新 d[] 与 pre[]

算法思想

Dijkstra采用  贪心策略   效率快   必须是 ***正权重***
  • 疑惑:u加入到S后,d[u]为s到u的最短路径 见书证明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法是一种单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。在Dijkstra算法中,我们可以通过记录每个节点的前驱节点来记录路径。具体实现如下: 1. 初始化一个distance数组,用来记录源节点到每个节点的距离,对于源节点,距离为0,对于其他节点,距离为无穷大。 2. 初始化一个visited数组,用来记录每个节点的访问状态,对于源节点,访问状态为true,对于其他节点,访问状态为false。 3. 初始化一个predecessor数组,用来记录每个节点的前驱节点,对于源节点,前驱节点为null,对于其他节点,前驱节点为undefined。 4. 将源节点加入一个优先队列中。 5. 从优先队列中取出一个节点,标记其为已访问,遍历其所有邻居节点,如果该邻居节点未被访问,则计算源节点到该邻居节点的距离,如果该距离小于distance数组中该节点的距离,则更新distance数组和predecessor数组,并将该邻居节点加入优先队列中。 6. 重复步骤5,直到所有节点都被访问过。 7. 根据predecessor数组可以得到源节点到每个节点的最短路径。 下面是一个JavaScript实现示例: ``` function dijkstra(graph, source) { var distance = []; var visited = []; var predecessor = []; var queue = new PriorityQueue(); for (var i = 0; i < graph.length; i++) { distance[i] = Infinity; visited[i] = false; predecessor[i] = undefined; } distance[source] = 0; queue.enqueue(source, 0); while (!queue.isEmpty()) { var u = queue.dequeue(); if (visited[u]) { continue; } visited[u] = true; for (var v = 0; v < graph[u].length; v++) { if (graph[u][v] !== 0 && !visited[v]) { var alt = distance[u] + graph[u][v]; if (alt < distance[v]) { distance[v] = alt; predecessor[v] = u; queue.enqueue(v, distance[v]); } } } } return predecessor; } ``` 注:上述实现中,我们使用了一个优先队列来存储节点和节点距离,这样可以保证每次取出的是距离最小的节点,从而保证算法的正确性。你可以使用任何优先队列实现,例如JavaScript中的数组,Java中的PriorityQueue等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值