数据结构与算法之最短路径--迪杰斯特拉算法

1 最短路径概念

1.1 定义

官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径。并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径。

1.2 对比

最小生成树:能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。
最短路径:是从一点出发,到达目的地的路径最小(到某顶点的路径也是最小)。

2 解析

原始图:
这里写图片描述

步骤1:从v0找到了未访问&最短路径顶点v1,步骤二:以v1为基础(二维数组第一下标)遍历相关联边(v2、v3、v4),并把权值计算对比大小,小的加到最短路径和数组中:
这里写图片描述

步骤1:遍历找到了未访问&最短路径顶点v2,步骤二:以v2为基础(二维数组第一下标)遍历相关联边(v4、v5),并把权值计算对比大小,小的加到最短路径和数组中:
这里写图片描述

这里写图片描述

这里写图片描述

这样就可以得到:V0到V8最短路径为:V8<-V7<-V6<-V3<-V4<-V2<-V1<-V0

即就是: V0->V1->V2->V4->V3->V6->V7->V8。

3 参考链接

数据结构图之三(最短路径–迪杰斯特拉算法)

4 源码

Graph源码

DnjavaDijstra .java

package com.dn.dijstra;

public class DnjavaDijstra {
    private final static int MAXVEX = 9;
    private final static int MAXWEIGHT = 65535;

    /**
     * Dijkstra算法,求有向网G的v0顶点到其余顶点v最短路径及带权长度
     * 
     * 最小生成树:能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。
     * 最短路径:是从一点出发,到达目的地的路径最小(到某顶点的路径也是最小)。
     */
    public void shortestPathDijstra(Graph graph) {
        int min;
        int k = 0;// 记录下标
        boolean isgetPath[] = new boolean[MAXVEX];//记录已找最小路径数组,isgetPath==true表示已找到
        int shortTablePath[] = new int[MAXVEX];//记录的是v0到某顶点的最短路径和

        //初始化第0行权值数组
        for (int v = 0; v < graph.getVertexSize(); v++) {
            shortTablePath[v] = graph.getMatrix()[0][v];// 默认获取v0这一行的权值数组
        }
        shortTablePath[0] = 0;
        isgetPath[0] = true;
        //开始主循环,每次求得v0到某个v顶点的最短路径
        for (int v = 1; v < graph.getVertexSize(); v++) {
            min = MAXWEIGHT;默认当前所知离v0顶点的最近距离
            //步骤1.查找离v0最近的顶点(v1)
            for (int w = 0; w < graph.getVertexSize(); w++) {
                if (!isgetPath[w] && shortTablePath[w] < min) {
                    k = w;//(v1)
                    min = shortTablePath[w];//w(v1)顶点离v0顶点更近
                }
            }

            //赋值
            isgetPath[k] = true;//将目前找到的最近的顶点置为true(v1)
            //步骤2.查找离v1最近的顶点(v2、v3、v4),并修正当前最短路径与距离
            for (int j = 0; j < graph.getVertexSize(); j++) {
                //如果经过v顶点的路径比现在这条路径的长度短的话
                if(!isgetPath[j]&&(min+graph.getMatrix()[k][j]<shortTablePath[j])){//(v1)到其他顶点路径
                    //找到了更短的路径,修改shortTablePath[j]
                    shortTablePath[j] = min + graph.getMatrix()[k][j];
                }
            }
        }

        for(int i = 0;i<shortTablePath.length;i++){
            System.out.println("V0到V"+i+"的最短路径为:"+shortTablePath[i]+"\n");
        }

    }

    public static void main(String[] args){
        Graph graph = new Graph(MAXVEX);
        graph.createGraph();
        DnjavaDijstra dijstra = new DnjavaDijstra();
        dijstra.shortestPathDijstra(graph);
    }
}
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值