Dijkstra 算法实现 sk 导航系统

一、任务及要求

        选用合适的数据结构及算法实现某校导航系统,使得当客 人无论从 1,2 号校门进入学校及在学校的某个教学楼、图书馆、办公楼、塔影阁、 东宿舍区、西宿舍区、快递点等地点都能最快游览到其它地点,并能顺利离开学 校。

二、设计与实现说明

        主要说明你的设计及实现思路,采用的数据结 构及类和方法的定义、功能、特点。

三、测试结果:包括输入和输出 (粘贴输入输出界面,实现结果界 面等)(部位贴图,详细见附件)

四、带注释的源代码及相关说明

package sj;
import java.util.*;
public class ShortestPathDijkstra {
 /** 邻接矩阵 */
 private int[][] matrix;
 /** 表示正无穷 */
 private int MAX_WEIGHT = Integer.MAX_VALUE;
 /** 顶点集合 */
 private String[] vertexes;
 /**
 * 创建图
 */
 private void createGraph(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 4, 
MAX_WEIGHT, MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v1 = {MAX_WEIGHT,0, MAX_WEIGHT, 1, MAX_WEIGHT,7, 
9, MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, MAX_WEIGHT, 0,MAX_WEIGHT, 6, 
MAX_WEIGHT, 2, MAX_WEIGHT, 3 };
 int[] v3 = { MAX_WEIGHT, 1, MAX_WEIGHT, 0, 2, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = {4, MAX_WEIGHT, 6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
 int[] v5 = { MAX_WEIGHT, 7, MAX_WEIGHT, 6, MAX_WEIGHT, 0, 
MAX_WEIGHT,2, MAX_WEIGHT };
 int[] v6 = { MAX_WEIGHT, 9, 2, 8, 
MAX_WEIGHT,MAX_WEIGHT,0,MAX_WEIGHT,2};
 int[] v7 = { 2, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, 0, MAX_WEIGHT };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, 3, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 2,MAX_WEIGHT, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "1 号门";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "2 号门";
 }
 private void createGraph1(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,3,MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v1 = {MAX_WEIGHT,0,MAX_WEIGHT, 1, MAX_WEIGHT, 7, 
9, MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { 2, MAX_WEIGHT, 0,MAX_WEIGHT, 6, MAX_WEIGHT, 
2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { MAX_WEIGHT, 1, MAX_WEIGHT, 0, 2, 6,9, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT,6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { MAX_WEIGHT, 7, MAX_WEIGHT,6, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = { 2, 9,2,8, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 2, MAX_WEIGHT, 0, 2};
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "2 号门";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph2(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,MAX_WEIGHT,1, MAX_WEIGHT, 7, 
9, MAX_WEIGHT, MAX_WEIGHT };
 int[] v1 = {MAX_WEIGHT,0,3, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, 3, 0,MAX_WEIGHT, 6, MAX_WEIGHT, 
2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { 1, MAX_WEIGHT, MAX_WEIGHT, 0, 2, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, 6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { 7, MAX_WEIGHT, MAX_WEIGHT, 6, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = {9, 2, 2, 8, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 2, MAX_WEIGHT, 0, 2 };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "塔影阁";
 vertexes[1] = "2 号门";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph3(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,3,MAX_WEIGHT,6,MAX_WEIGHT, 2, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v1 = {MAX_WEIGHT,0,MAX_WEIGHT, 1, MAX_WEIGHT,7, 9, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { 3, MAX_WEIGHT, 0,MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { MAX_WEIGHT, 1, MAX_WEIGHT, 0, 2, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { 6, MAX_WEIGHT, MAX_WEIGHT,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { MAX_WEIGHT, 7, MAX_WEIGHT, 6, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = { 2, 9, 2, 8, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT,2, MAX_WEIGHT, 0,2 };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT,4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "C5 教学楼";
 vertexes[1] = "塔影阁";
 vertexes[2] = "2 号门";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph4(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, 1,MAX_WEIGHT,MAX_WEIGHT, 2, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v1 = {1,0,MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 7,9, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, MAX_WEIGHT, 0,3, 6, MAX_WEIGHT, 
2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { MAX_WEIGHT, MAX_WEIGHT, 3, 0, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { 2, MAX_WEIGHT, 6,MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { 6, 7, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = { 8, 9, 2, 2, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "图书馆";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "2 号门";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph5(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,6,2, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 4 };
 int[] v1 = {MAX_WEIGHT,0,MAX_WEIGHT, 1, MAX_WEIGHT, 7, 
9, MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { 6, MAX_WEIGHT, 0,MAX_WEIGHT, 3, MAX_WEIGHT, 
2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { 2,1, MAX_WEIGHT, 0, MAX_WEIGHT, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, 3,MAX_WEIGHT, 0, 
MAX_WEIGHT,2, MAX_WEIGHT, MAX_WEIGHT};
 int[] v5 = { MAX_WEIGHT, 7, MAX_WEIGHT, 6, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = { MAX_WEIGHT, 9, 2, 8, 2, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 2, MAX_WEIGHT, 0, 2 };
 int[] v8 = {4, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "办公楼";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "2 号门";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph6(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, 7,MAX_WEIGHT,1, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v1 = {7,0,MAX_WEIGHT, 1, MAX_WEIGHT, MAX_WEIGHT, 
9, MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, MAX_WEIGHT, 0,MAX_WEIGHT, 6, 3, 
2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { 1, 1, MAX_WEIGHT, 0,2, MAX_WEIGHT, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, 6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT,4};
 int[] v5 = { MAX_WEIGHT, MAX_WEIGHT, 3, MAX_WEIGHT, 
MAX_WEIGHT, 0, 2, MAX_WEIGHT, MAX_WEIGHT };
 int[] v6 = { MAX_WEIGHT, 9, 2, 8, MAX_WEIGHT, 2, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { 2, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 2};
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "顾塔里宿舍区";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "2 号门";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph7(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, 9,2,8, MAX_WEIGHT, MAX_WEIGHT, 2, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v1 = {9,0,MAX_WEIGHT, 1, MAX_WEIGHT,7, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { 2, MAX_WEIGHT, 0,MAX_WEIGHT, 6, MAX_WEIGHT, 
3, MAX_WEIGHT, MAX_WEIGHT };
 int[] v3 = { 8, 1, MAX_WEIGHT, 0, 2, 6, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT,6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { MAX_WEIGHT,7, MAX_WEIGHT,6, MAX_WEIGHT, 0, 
MAX_WEIGHT, 2, MAX_WEIGHT };
 int[] v6 = { 2, MAX_WEIGHT,3, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 0, MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT,2, MAX_WEIGHT, 0,2 };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, 4, MAX_WEIGHT, MAX_WEIGHT,2, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "西区组团";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "2 号门";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 private void createGraph8(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT, 
MAX_WEIGHT, 2, MAX_WEIGHT, MAX_WEIGHT, 2 };
 int[] v1 = {MAX_WEIGHT,0,MAX_WEIGHT, 1, MAX_WEIGHT,7, 9, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, MAX_WEIGHT, 0,MAX_WEIGHT, 6, 
MAX_WEIGHT, 2, 3, MAX_WEIGHT };
 int[] v3 = { MAX_WEIGHT, 1, MAX_WEIGHT, 0,2, 6, 8, 
MAX_WEIGHT, MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, 6,2, 0, 
MAX_WEIGHT,MAX_WEIGHT, MAX_WEIGHT, 4};
 int[] v5 = { 2, 7, MAX_WEIGHT, 6, MAX_WEIGHT, 0, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
 int[] v6 = { MAX_WEIGHT, 9, 2, 8, MAX_WEIGHT, MAX_WEIGHT, 
0, 2,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, 3, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 2, 0, MAX_WEIGHT };
 int[] v8 = { 2, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 4, 
MAX_WEIGHT, MAX_WEIGHT,MAX_WEIGHT, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "快递点";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "2 号门";
 vertexes[8] = "1 号门";
 }
 private void createGraph9(int index){
 matrix = new int[index][index];
 vertexes = new String[index];
 
 int[] v0 = { 0, MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT };
 int[] v1 = {MAX_WEIGHT,0,MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT };
 int[] v2 = { MAX_WEIGHT, MAX_WEIGHT, 0,MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT };
 int[] v3 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT };
 int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT,MAX_WEIGHT, 0, MAX_WEIGHT,MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT};
 int[] v5 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, 0, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT };
 int[] v6 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT,MAX_WEIGHT};
 int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 
MAX_WEIGHT };
 int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 
MAX_WEIGHT,MAX_WEIGHT, 0 };
 
 matrix[0] = v0;
 matrix[1] = v1;
 matrix[2] = v2;
 matrix[3] = v3;
 matrix[4] = v4;
 matrix[5] = v5;
 matrix[6] = v6;
 matrix[7] = v7;
 matrix[8] = v8;
 
 vertexes[0] = "2 号门";
 vertexes[1] = "塔影阁";
 vertexes[2] = "C5 教学楼";
 vertexes[3] = "图书馆";
 vertexes[4] = "办公楼";
 vertexes[5] = "顾塔里宿舍区";
 vertexes[6] = "西区组团";
 vertexes[7] = "快递点";
 vertexes[8] = "1 号门";
 }
 /**
 * Dijkstra 最短路径。
 * 
 * vs -- 起始顶点(start vertex) 即,统计图中"顶点 vs"到其它各个顶点的
最短路径。
 */
 public void dijkstra(int vs) {
 // flag[i]=true 表示"顶点 vs"到"顶点 i"的最短路径已成功获取
 boolean[] flag = new boolean[vertexes.length];
 // U 则是记录还未求出最短路径的顶点(以及该顶点到起点 s 的距离),
与 flag 配合使用,flag[i] == true 表示 U 中 i 顶点已被移除
 int[] U = new int[vertexes.length];
 // 前驱顶点数组,即,prev[i]的值是"顶点 vs"到"顶点 i"的最短路径所
经历的全部顶点中,位于"顶点 i"之前的那个顶点。
 int[] prev = new int[vertexes.length];
 // S 的作用是记录已求出最短路径的顶点
 String[] S = new String[vertexes.length];
 // 步骤一:初始时,S 中只有起点 vs;U 中是除 vs 之外的顶点,并且
U 中顶点的路径是"起点 vs 到该顶点的路径"。
 for (int i = 0; i < vertexes.length; i++) {
 flag[i] = false; // 顶点 i 的最短路径还没获取到。
 U[i] = matrix[vs][i]; // 顶点 i 与顶点 vs 的初始距离为"顶点 vs"到
"顶点 i"的权。也就是邻接矩阵 vs 行的数据。
 
 prev[i] = 0; //顶点 i 的前驱顶点为 0
 }
 // 将 vs 从 U 中“移除”(U 与 flag 配合使用)
 flag[vs] = true;
 U[vs] = 0;
 // 将 vs 顶点加入 S
 S[0] = vertexes[vs];
 // 步骤一结束
 //步骤四:重复步骤二三,直到遍历完所有顶点。
 // 遍历 vertexes.length-1 次;每次找出一个顶点的最短路径。
 int k = 0;
 for (int i = 1; i < vertexes.length; i++) {
 // 步骤二:从 U 中找出路径最短的顶点,并将其加入到 S 中(如
果 vs 顶点到 x 顶点还有更短的路径的话,那么
 // 必然会有一个 y 顶点到 vs 顶点的路径比前者更短且没有加入 S
中
 // 所以,U 中路径最短顶点的路径就是该顶点的最短路径)
 // 即,在未获取最短路径的顶点中,找到离 vs 最近的顶点(k)。
 int min = MAX_WEIGHT;
 for (int j = 0; j < vertexes.length; j++) {
 if (flag[j] == false && U[j] < min) {
 min = U[j];
 k = j;
 }
 }
 
 //将 k 放入 S 中
 S[i] = vertexes[k];
 
 //步骤二结束
 
 
 //步骤三:更新 U 中的顶点和顶点对应的路径
 //标记"顶点 k"为已经获取到最短路径(更新 U 中的顶点,即将 k
顶点对应的 flag 标记为 true)
 flag[k] = true;
 
 //修正当前最短路径和前驱顶点(更新 U 中剩余顶点对应的路径)
 //即,当已经"顶点 k 的最短路径"之后,更新"未获取最短路径的
顶点的最短路径和前驱顶点"。
 for (int j = 0; j < vertexes.length; j++) {
 //以 k 顶点所在位置连线其他顶点,判断其他顶点经过最短
路径顶点 k 到达 vs 顶点是否小于目前的最短路径,是,更新入 U,不是,不做
处理
 int tmp = (matrix[k][j] == MAX_WEIGHT ? 
MAX_WEIGHT : (min + matrix[k][j]));
 if (flag[j] == false && (tmp < U[j])) {
 U[j] = tmp;
 //更新 j 顶点的最短路径前驱顶点为 k
 prev[j] = k;
 }
 }
 //步骤三结束
 }
 //步骤四结束
 // 打印 dijkstra 最短路径的结果
 System.out.println("起始顶点:" + vertexes[vs] +"(sk)");
 for (int i = 0; i < vertexes.length; i++) {
 System.out.print("最短路径(" + vertexes[vs] + "," + vertexes[i] + 
"):" + U[i] + " ");
 
 List<String> path = new ArrayList<>();
 int j = i;
 while (true) {
 path.add(vertexes[j]);
 
 if (j == 0)
 break;
 
 j = prev[j];
 }
 
 for (int x = path.size()-1; x >= 0; x--) {
 if (x == 0) {
 System.out.println(path.get(x));
 } else {
 System.out.print(path.get(x) + "->");
 }
 }
 
 }
 
 System.out.println("顶点放入 S 中的顺序:");
 for (int i = 0; i< vertexes.length; i++) {
 
 System.out.print(S[i]);
 
 if (i != vertexes.length-1) 
 System.out.print("-->");
 }
 
 }
 public static void main(String[] args) {
 System.out.println("***************************欢迎来到sk导航系统***************************");
 System.out.println("sk导航已为您规划最佳游览路线,请您查收,仔
细阅读");
 ShortestPathDijkstra dij = new ShortestPathDijkstra();
 dij.createGraph(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph1(9);
 dij.dijkstra(0); 
 System.out.println();
 dij.createGraph2(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph3(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph4(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph5(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph6(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph7(9);
 dij.dijkstra(0);
 System.out.println();
 dij.createGraph8(9);
 dij.dijkstra(0);
 System.out.println();
 System.out.println("导航结束,谢谢使用");
 }
}

五、心得与体会

        本次实验针对具体问题来进行需求分析、测试计划、概要设计、详细设计、 测试分析等具体步骤,从中我们收获了许多。首先,在编写函数时要充分利用各 种资源,其次,要更加详细的考虑实际情况,提高程序的实用性,最重要的当然 是组员之间的团结协作。 程序设计的过程实际上也是加深对图及 Dijkstra 算法认识的过程,当然后 者更是前者的基础,我们在实现 Dijkstra 算法前必须自己独立设计一个图,列 出对应矩阵,这样方便我们算法的设计。当然我们可以通过网络学习加强理解, 虽然只是看了几个关于 C 语言的数据结构网课,但是它的数组实现方式让我们从 另一方面了解了 Dijkstra 算法。 通过本次实验,再次强化了我们函数调用、函数声明、全局变量、局部变量、 图以及戴克斯特拉算法的应用。编程本是一件枯燥的事,但是只要我们认真的去 对待,总会在过程中收获书本上学不到的东西。

注:因博客迁移所以直接把pdf放在这里了(CR)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antidote 

欢迎打赏,给点动力呀大佬们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值