Dijkstra--迪杰斯特拉 | 最短路径算法

92 篇文章 0 订阅
42 篇文章 0 订阅

场景:正权有向边找最短路径

//自我讲解,可能不是你所想要的搜索回答。

举例:

                

找到从A到E的最短路径

从A可到达B、C、D记录下来,(B 上一节点A,最短距离为1) ……

接着从记录的点中找到最短距离的那个点,这会有点B和C,然后更新(比如本来D点信息为上一个节点为A,最短距离为3,(由于当选节点C时,节点D要更新),更新为上一节点为C,最短距离为2)

注意要求权值为正值,是有必要的。

比如通过A可以找到B(1)、C(1)、D(3)的最短距离。

在更新E的最短距离时,假设DE之间距离为-4。

正常迪杰斯特拉算法要求 去求E点的最短路径,应该是按照E的上一个节点是B,E的最短距离为2.

但DE距离为负,本来死活不会 让E的上一个结点为D(也就是不会走经过D点这条路),按照这个负数距离,E的最短距离为1,最后最短距离为1.是不是很离谱?

//网络延迟时间,找到从K到所有结点的最短距离,使用迪杰斯特拉算法
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        const int inf = INT_MAX / 2;        
        vector<vector<int> > g(n, vector<int>(n, inf));        //初始化结点之间无穷远
        //memset(g, ox3f, sizeof(g));
        for(auto &t : times){                               //把数据保存在g[x][y] = 边长
            int x = t[0] - 1 , y = t[1] - 1 ;
            g[x][y] = t[2];
        }
        vector<bool> used(n, false);
        vector<int> dist(n, inf);
        //memset(dist, ox3f, sizeof(dist));
        dist[k - 1] = 0;                //起始点到起始点的距离为0

        for(int i = 0; i < n; ++i){            //类似遍历矩阵行
            int x = -1;
            for(int j = 0; j < n;++j){        //找到 j点最短路径的上一个点x
                if(!used[j] && (x == -1 || dist[j] < dist[x]) ){
                    x = j;
                }
            }
            used[i] = true;                    //找到x后设置标记
            for(int j = 0; j < n; ++j){        //
                dist[j] = min(dist[j], g[x][j] +dist[x]);        //求出y点的最短路径
            }
        }
        int ans = *max_element(dist.begin(), dist.end());        //返回最大值
        return ans == inf ? -1 : ans;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迪杰斯特拉算法是一种用于计算图中单源最短路径的贪心算法。它的主要思想是从起点开始,逐步扩展到其他节点,直到到达终点或者所有节点都被扩展。在扩展的过程中,维护一个距离数组,记录起点到每个节点的最短距离,同时维护一个集合,记录已经找到最短路径的节点。每次从未找到最短路径的节点中选择距离起点最近的节点进行扩展,更新距离数组中的距离值。重复这个过程,直到到达终点或者所有节点都被扩展。 以下是一个使用迪杰斯特拉算法求解最短路径的Python代码示例: ```python import heapq def dijkstra(graph, start, end): # 初始化距离数组和已找到最短路径的节点集合 dist = {node: float('inf') for node in graph} dist[start] = 0 visited = set() # 使用堆优化的Dijkstra算法 heap = [(0, start)] while heap: (d, node) = heapq.heappop(heap) if node in visited: continue visited.add(node) if node == end: return d for neighbor, cost in graph[node].items(): if neighbor in visited: continue new_dist = dist[node] + cost if new_dist < dist[neighbor]: dist[neighbor] = new_dist heapq.heappush(heap, (new_dist, neighbor)) # 如果无法到达终点,返回None return None # 示例图 graph = { 'A': {'B': 5, 'C': 1}, 'B': {'A': 5, 'C': 2, 'D': 1}, 'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8}, 'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6}, 'E': {'C': 8, 'D': 3}, 'F': {'D': 6} } # 求解A到F的最短路径 print(dijkstra(graph, 'A', 'F')) # 输出:8 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值