本文实例为大家分享了Dijkstra算法实现校园导游程序的具体代码,供大家参考,具体内容如下
应用设计性实验
1.问题描述
校网导游程序: 一个校园有若干景点,如正校门、人工湖、磁悬浮列车实验室、樱花大道、图书馆、体育场体育馆和礼堂等。实现一个为来访客 人提供信息在询服务的程序,如查询景点的详细信息,查询两个景点之间的一条最短路径。
2.实验要求
(1)设计你所在学校的校园平面图,所含景点不少于10个。
(2)来访客人可以输人任一个景点的名称,查询景点的详细信息。
(3)来访客人可以输人任何两个景点的名称,查询这两个景点之间的一条最短路径。
3.实现提示
以图中的顶点表示校园内各景点,存放景点代号、名称和简介等信息;以边表示路径,存放路径长度等相关信息,如实验图10.2所示。本题可采用邻接方阵或邻接表实现图的存储结构,利用迪杰斯特拉算法求得最短路径。
该程序“见错就收”、“见好就收”效率比较高——“剪枝”。
import java.util.ArrayList;
import java.util.Scanner;
public class TourGuide {
private static final Site[] sites = new Site[14];//以地点代号循序存放地点
private static final ArrayList<String> arrSites = new ArrayList<>();
private static final double[][] matrix = new double[14][14];//用来存放地点间的路径长度(对角线为0,不存在为INFINITY)
static {
sites[0] = new Site(0, "正校门", "正校门...");//初始化存放地点的数组
sites[1] = new Site(1, "东校门", "东校门...");
sites[2] = new Site(2, "西校门", "西校门...");
sites[3] = new Site(3, "北校门", "北校门...");
sites[4] = new Site(4, "食堂", "食堂...");
sites[5] = new Site(5, "磁悬浮列车实验室", "磁悬浮列车实验室...");
sites[6] = new Site(6, "樱花大道", "樱花大道...");
sites[7] = new Site(7, "图书馆", "图书馆...");
sites[8] = new Site(8, "体育场", "体育场...");
sites[9] = new Site(9, "体育馆", "体育馆...");
sites[10] = new Site(10, "游泳馆", "游泳馆...");
sites[11] = new Site(6, "礼堂", "礼堂...");
sites[12] = new Site(6, "教学楼", "教学楼...");
sites[13] = new Site(6, "宿舍", "宿舍...");
matrix[0][4] = 35;//初始化地点间的路径长度
matrix[0][11] = 5;
matrix[1][10] = 75;
matrix[1][13] = 10;
matrix[2][4] = 30;
matrix[2][7] = 5;
matrix[3][6] = 15;
matrix[3][7] = 50;
matrix[3][9] = 15;
matrix[3][10] = 20;
matrix[4][8] = 60;
matrix[4][11] = 40;
matrix[5][8] = 45;
matrix[5][11] = 10;
matrix[8][11] = 50;
matrix[9][10] = 20;
matrix[9][13] = 100;
matrix[11][12] = 25;
matrix[12][13] = 20;
for (Site site : sites) arrSites.add(site.getName()); //初始化ArrayList,用于以字符串的形式按顺序存放地点的名字
for (int i = 0; i < sites.length; i++) {//初始化地点间的路径长度
for (int j = 0; j < sites.length; j++) {
if (i != j && matrix[i][j] == 0)
matrix[i][j] = Double.POSITIVE_INFINITY;
if (i > j)
matrix[i][j] = matrix[j][i];
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int select;
while (true) {
System.out.println("请输入您想了解的信息:\n1.查询地点详细信息\n2.查询地点间的最短路径\n3.退出系统");
select = scanner.nextInt();
switch (select) {
case 1:
System.out.print("输入查询地点的名称: ");
String siteIntro = query(scanner.next());
if (siteIntro != null) {//其实这里也可以直接arrSites.indexOf(name)判断
System.out.println(siteIntro);
} else {
System.err.println("输入的地点名称不存在!");
}
break;
case 2:
System.out.print("输入所要查询最短路径的两地的名称(例如:正校门-礼堂): ");
String path = findShortestPath(scanner.next());
if (path != null) {
System.out.println(path);
} else {
System.err.println("输入的所要查询最短路径的两地的名称或者格式有误!");
}
break;
case 3:
System.exit(0);
default:
System.err.println("输入的选项有误!");
}
System.out.println();
}
}
public static String query(String siteName) {
int index = arrSites.indexOf(siteName);
if (index == -1) {
return null;
} else {
return sites[index].getIntro();
}
}
public static String findShortestPath(String path) {
int indexOfSeparator = path.indexOf('-');
if (indexOfSeparator == -1) return null;
String start = path.substring(0, indexOfSeparator);
String end = path.substring(indexOfSeparator + 1);
int indexOfStart = arrSites.indexOf(start);
int indexOfEnd = arrSites.indexOf(end);
if (indexOfStart == -1 || indexOfEnd == -1) return null;
return dijkstra(indexOfStart, indexOfEnd);
}
private static String dijkstra(int start, int end) {
int vertexCount = TourGuide.matrix.length;
boolean[] isInUSet = new boolean[vertexCount];//数组元素默认初始化为false
double[] distant = new double[vertexCount];
int[] parent = new int[vertexCount];
for (int i = 0; i < vertexCount; i++) {
distant[i] = TourGuide.matrix[start][i];
parent[i] = start;
}
isInUSet[start] = true;
distant[start] = 0;
parent[start] = -1;
for (int i = 0; i < vertexCount; i++) {
double minCost = Double.POSITIVE_INFINITY;
int minIndex = start;
for (int j = 0; j < vertexCount; j++) {
if (!isInUSet[j])
if (distant[j] < minCost) {
minCost = distant[j];
minIndex = j;
}
}
if (minCost < Double.POSITIVE_INFINITY) {
isInUSet[minIndex] = true;
} else {
break; //处理的图为非连通图,即不输出相应路径(不存在能达到该顶点的路径)
}
if (minIndex == end)//找到后直接return提高效率
return printDijkstra(parent, distant, start, end);
for (int j = 0; j < vertexCount; j++) {//迭代优化
if (!isInUSet[j] && distant[minIndex] + TourGuide.matrix[minIndex][j] < distant[j]) {
distant[j] = distant[minIndex] + TourGuide.matrix[minIndex][j];
parent[j] = minIndex;
}
}
}
return null;
}
private static String printDijkstra(int[] parent, double[] distant, int start, int end) {
int p = parent[end];
StringBuilder path = new StringBuilder(arrSites.get(end));
while (p != -1) {
path.insert(0, arrSites.get(p) + "->");
p = parent[p];
}
return arrSites.get(start) + "->" + arrSites.get(end) + " [" + path + "]: " + distant[end];
}
}
class Site {
private int code;
private String name;
private String intro;
public Site(int code, String name, String intro) {
this.code = code;
this.name = name;
this.intro = intro;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。