Dijkstra算法(单源最短路)

文章介绍了在图G(V,E)中寻找从起点S到终点T的最短路径的几种常见算法,包括Dijkstra算法、Bellman-Ford算法、SPFA算法和Floyd算法。重点讲解了Dijkstra算法的工作原理,通过设置已访问顶点集合S,逐步更新未访问顶点的最短距离,直至遍历所有顶点。
摘要由CSDN通过智能技术生成

问题:对任意给出的图G(V,E)和起点S、终点T,如何求从S到T的最短路径。
解法:解决最短路径问题的常用算法有 Dijkstra算法、Bellman-Ford 算法、SPFA算法和Floyd算法。

Dijkstra算法思想

对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合 V-S 中选择与起点s 的最短距离最小的一个顶点(记为 u),访问并加入集合 S。之后,令顶点u 为中介点,更新起点 s 与所有从u 能到达的顶点v之间的最短距离。这样的操作执行 n次(n为顶点个数),直到集合 S已包含所有顶点。

代码:

void dijkstra() {
        // 初始化
        Arrays.fill(vis, false);
        Arrays.fill(dist, INF);//dist[i]:顶点i到起点s的距离
        // 起点s
        dist[s] = 0;
        // 操作执行n次(n为顶点个数),直到集合 S已包含所有顶点。
        for (int p = 1; p <= n; p++) {
            // 从V-S集合(vis[i]==false)中找到距离最近的点
            int u = -1;
            for (int i = 1; i <= n; i++) {
                if (!vis[i] && (u == -1 || dist[i] < dist[u])) u = i;
            }
            // u加入集合S,更新最短距离
            vis[u] = true;
            for (int i = 1; i <= n; i++) {
                dist[i] = Math.min(dist[i], dist[u] + w[u][i]);
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值