Java编程:迪杰斯特拉算法(已知固定起点最短路径问题)

  1. 战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄

  2. 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里

  3. 问:如何计算出G村庄到 其它各个村庄的最短距离?

  4. 如果从其它点出发到各个点的最短距离又是多少?

思路图解

===============================================================

在这里插入图片描述

代码实现

===============================================================

package dijkstra;

import java.util.Arrays;

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];

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);

// 测试

graph.showGraph();

// 测试迪杰斯特拉算法

graph.dsj(6);

// 查看结果

graph.showDijkstra();

}

}

class Graph {

private char[] vertex; // 顶点数组

private int[][] matrix; // 邻接矩阵

private VisitedVertex vv; // 已经访问的结点集合

// 构造器

public Graph(char[] vertex, int[][] matrix) {

this.vertex = vertex;

this.matrix = matrix;

}

// 显示图的方法

public void showGraph() {

for (int[] link : matrix) {

System.out.println(Arrays.toString(link));

}

}

/**

  • 迪杰斯特拉算法实现

  • @param index 表示出发顶点对应的下标

*/

public void dsj(int index) {

vv = new VisitedVertex(vertex.length, index);

update(index); // 更新index顶点到周围顶点距离和前驱顶点

for (int i = 0; i < vertex.length; i++) {

index = vv.updateArr(); // 选择并返回新的访问顶点

update(index); // 更新index下标顶点到周围顶点的距离和周围顶点的前驱结点

}

}

// 更新index下标顶点到周围顶点的距离和周围顶点的前驱结点

private void update(int index) {

int len = 0;

// 根据遍历我们的邻接矩阵的matrix[index]行

for (int j = 0; j < matrix[index].length; j++) {

// len 含义是:出发顶点到index顶点的距离 + 从index顶点到j顶点的距离和

len = vv.getDis(index) + matrix[index][j];

// 如果j顶点没有被访问过,并且len小于出发顶点到j顶点的距离,就需要更新

if (!vv.in(j) && len < vv.getDis(j)) {

vv.updatePre(j, index); // 更新j顶点的前驱为index顶点

vv.updateDis(j, len); // 更新出发顶点到j顶点的距离

}

}

}

// 显示结果

public void showDijkstra() {

vv.show();

}

}

// 已访问顶点集合

class VisitedVertex {

// 记录各个顶点是否访问过,1表示访问过,0表示未访问,会动态更新

public int[] already_arr;

// 每个下标对应的值为前一个顶点下标,会动态更新

public int[] pre_visited;

// 记录出发顶点到其他所有顶点的距离,比如G为出发顶点,就会记录G到其他顶点的距离,会动态更新

// 求的最短距离就会存放到dis

public int[] dis;

/**

  • @param length 表示顶点的个数

  • @param index 表示出发顶点对应的下标,比如G顶点,传入下标6

*/

public VisitedVertex(int length, int index) {

this.already_arr = new int[length];

this.pre_visited = new int[length];

this.dis = new int[length];

// 初始化diss数组,全部填充为65535

Arrays.fill(dis, 65535);

this.already_arr[index] = 1; // 设置出发顶点被访问过

this.dis[index] = 0; // 设置出发顶点的访问距离为0

}

/**

  • 功能:判断index顶点是否被访问过

  • @param index 下标

  • @return 如果访问过,返回true,否则返回false

*/

public boolean in(int index) {

return already_arr[index] == 1;

}

/**

  • 功能:更新出发顶点到index的距离

  • @param index 下标

  • @param len 长度

*/

public void updateDis(int index, int len) {

dis[index] = len;

}

/**

  • 功能:更新pre顶点的前驱顶点为index的顶点

  • @param pre 顶点

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

试专题**

[外链图片转存中…(img-Y8G9wHk0-1714137230908)]

SpringBoot面试专题

[外链图片转存中…(img-N1trVEtj-1714137230908)]

zookeeper面试专题

[外链图片转存中…(img-E5Aq0HSG-1714137230909)]

常见面试算法题汇总专题

[外链图片转存中…(img-NlXyCdtp-1714137230909)]

计算机网络基础专题

[外链图片转存中…(img-qqGEk1DS-1714137230909)]

设计模式专题

[外链图片转存中…(img-9odGu1vB-1714137230910)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值