目录
一、迪杰斯特拉(Dijkstra)算法介绍
- 一、迪杰斯特拉(Dijkstra)算法介绍
- 二、迪杰斯特拉(Dijkstra)算法过程
- 三、迪杰斯特拉(Dijkstra)算法——应用场景(最短路径问题)
- 四、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的思路图解
- 五、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的代码实现
- 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
- 设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di)
- 从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi即为最短路径
- 更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v通过vi到V集合中顶点的距离值,保留值较小的一个(同时也应该更新顶点的前驱节点为vi,表明是通过vi到达的)
- 重复执行两步骤,直到最短路径顶点为目标顶点即可结束
战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄;各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里;问:如何计算出G村庄到 其它各个村庄的最短距离? 如果从其它点出发到各个点的最短距离又是多少?
1、邻接矩阵如下图:
2、代码
package com.rf.data_structure_algorithm.algorithm.dijkstra;
import java.util.Arrays;
/**
* @description: 迪杰斯特拉算法
* @author: xiaozhi
* @create: 2020-11-26 21:28
*/
public class DijkstraAlgorithm {
public static void main(String[] args) {
//定义顶点数组
char[] vertex={'A','B','C','D','E','F','G'};
//定义邻接矩阵
int[][] matrix=new int[vertex.length][vertex.length];
//N:表示不可以连接
final int N = 65535;
matrix[0]=new int[]{N,5,7,N,N,N,2};
matrix[1]=new int[]{5,N,N,9,N,N,3};
matrix[2]=new int[]{7,N,N,N,8,N,N};
matrix[3]=new int[]{N,9,N,N,N,4,N};
matrix[4]=new int[]{N,N,8,N,N,5,4};
matrix[5]=new int[]{N,N,N,4,5,N,6};
matrix[6]=new int[]{2,3,N,N,4,6,N};
//创建 Graph对象
Graph graph = new Graph(vertex, matrix);
//测试, 看看图的邻接矩阵是否ok
graph.showGraph();
//测试迪杰斯特拉算法
graph.dsj(2);//C
graph.showDijkstra();
}
}
/**
* @Description: 创建图
* @Author: xz
* @Date: 2020/11/26 21:29
*/
class Graph{
char[] vertex; // 顶点数组
int[][] matrix;// 邻接矩阵
VisitedVertex vv; //已经访问的顶点的集合
//构造方法
public Graph(char[] vertex, int[][] matrix) {
this.vertex = vertex;
this.matrix = matrix;
}
//显示结果
public void showDijkstra() {
vv.show();
}
// 显示图
public void showGraph(){
for(int[] link :matrix){
System.out.println(Arrays.toString(link));
}
}
/**
* @Description: 迪杰斯特拉算法实现
* @Param: index 表示出发顶点对应的下标
* @Author: xz
* @Date: 2020/11/26 21:56
*/
public void dsj(int index) {
vv = new VisitedVertex(vertex.length, index);
update(index);//更新index顶点到周围顶点的距离和前驱顶点
for(int j = 1; j
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?