狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径

简介: 狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径

1、狄克斯特拉(Dijkstra)算法

采用狄克斯特拉(Dijkstra)算法可以求带权图(所有权值为正数)中一个顶点到其余各顶点的最短路径,称其为单源最短路径算法。

2、设计思想

用visit数组标记已访问过的元素,visit【j】=1,表示已访问过。dist【j】用来保存从源点v到顶点j的当前最短路径长度,他的初值为v的邻接点的权值。path【j】用于保存从源点v到j的最短路径长度,实际上,path【j】保存从源点v到顶点j的当前最短路径中顶点j的前一个顶点的编号,他的初值为源点(有边时)v的编号或-1(无边时)。

以下代码仅供参考

以下代码仅供参考

以下代码仅供参考

/**
 *作者:魏宝航
 *2020年11月23日,下午19:19
 */
import org.omg.CORBA.INTERNAL;
import java.io.IOException;
import java.util.Scanner;
public class MatrixUDG {
    private char[] mVexs;
    private int[][] mMatrix;
    private int num;
    public MatrixUDG(char[] vexs, char[][] edges) {
        num = vexs.length;
        mVexs = new char[num];
        for (int i = 0; i < mVexs.length; i++)
            mVexs[i] = vexs[i];
        mMatrix = new int[num][num];
        for(int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                if(edges[i][j]=='∞'){
                    mMatrix[i][j]=Integer.MAX_VALUE;
                }else{
                    mMatrix[i][j]=Integer.parseInt(edges[i][j]+"");
                }
            }
        }
    }
    public void print() {
        System.out.printf("Martix Graph:\n");
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++){
                if(mMatrix[i][j]<Integer.MAX_VALUE){
                    System.out.printf("%d ", mMatrix[i][j]);
                }else{
                    System.out.print("∞ ");
                }
            }
            System.out.printf("\n");
        }
    }
    public void Dijkstra(int v){
        int[] dist=new int[1000];
        int[] path=new int[1000];
        int[] visit=new int[1000];
        int min=Integer.MAX_VALUE;
        int k=0;
        for(int i=0;i<this.num;i++){
            dist[i]=this.mMatrix[v][i];
            visit[i]=0;
            if(this.mMatrix[v][i]<Integer.MAX_VALUE){
                path[i]=v;
            }
            else{
                path[i]=-1;
            }
        }
        visit[v]=1;
        for(int i=0;i<this.num;i++){
            min=Integer.MAX_VALUE;
            for(int j=0;j<this.num;j++){
                if(visit[j]==0&&dist[j]<min){
                    min=dist[j];
                    k=j;
                }
            }
            visit[k]=1;
            for(int j=0;j<this.num;j++){
                if(visit[j]==0){
                    if(this.mMatrix[i][j]<Integer.MAX_VALUE&&dist[k]+this.mMatrix[k][j]<dist[j]){
                        dist[j]=dist[k]+this.mMatrix[k][j];
                        path[j]=k;
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        char[] vexs={'0','1','2','3','4','5'};
        char[][] edges=new char[][]{
                {'0','6','1','5','∞','∞'},
                {'6','0','5','∞','3','∞'},
                {'1','5','0','5','6','4'},
                {'5','∞','5','0','∞','2'},
                {'∞','3','6','∞','0','6'},
                {'∞','∞','4','2','6','0'},
        };
        MatrixUDG g=new MatrixUDG(vexs,edges);
        g.print();
    }
}


目录
相关文章
|
21天前
|
存储 算法 数据可视化
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
|
25天前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
29 1
|
5天前
|
算法 Java
Java数据结构与算法:最短路径算法
Java数据结构与算法:最短路径算法
|
7天前
|
算法 Java 定位技术
Java数据结构与算法:贪心算法之最短路径
Java数据结构与算法:贪心算法之最短路径
|
1月前
|
算法 Java
JAVA中实现最短距离算法——Dijkstra算法详解
JAVA中实现最短距离算法——Dijkstra算法详解
15 1
|
10天前
|
算法 定位技术
探寻最短路径之谜:Dijkstra算法详解
探寻最短路径之谜:Dijkstra算法详解
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
2月前
|
算法 机器人 Python
Python实现教程:平面最短路径算法
Python实现教程:平面最短路径算法
30 1
|
2月前
|
网络协议 算法 数据库
【专栏】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法
【4月更文挑战第28天】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法。其特点是分层设计、快速收敛、高效资源利用和强故障恢复能力。在现代网络中,IS-IS广泛应用于服务提供商、企业网络及与其他协议的融合,是构建稳定、高效网络的关键。了解和应用IS-IS能提升网络系统的可靠性和效率。
|
1天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。