Java基于Dijkstra算法实现校园导游程序
作者:Feyl 发布时间:2021-10-15 15:38:18
标签:java,校园,导游
本文实例为大家分享了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;
}
}
来源:https://blog.csdn.net/qq_46539113/article/details/111128569


猜你喜欢
- * 惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧!在项目中这种添加图片上传的效
- 前言大家都知道MySQL数据库很好用,但数据量到了千万以上了,想增加字段是非常痛苦的,这个在MongoDB里就不存在,字段想怎么加就怎么加,
- Springboot添加server.servlet.context-pathserver.servlet.context-path配置的作
- 协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下
- 前言最近项目中需要用到字符串加解密,遂研究了一波,发现密码学真的是博大精深,好多算法的设计都相当巧妙,学到了不少东西,在这里做个小小的总结,
- 前言:synchronized 在 JDK 1.5 之前性能是比较低的,在那时我们通常会选择使用 Lock 来替代 synchronized
- /** * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类 * * @author Marydon * @createTi
- 一、问题描述Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Serv
- 介绍Java状态模式(State Pattern)是一种面向对象的设计模式,它将对象的状态封装成独立的状态对象,并将对象的行为与状态对象解耦
- MessageDigestMessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向
- ShardingSphereShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、
- 工程搭建1.File->new->project;2.选择“Spring Initializr”,点击next;(jdk1.8默
- 一、电量统计模块概述耗电信息在设置 -> 电量中能够非常直观的看到。注意,Android 所有功耗统计都是通过代码估算,没有集成电路参
- Java 队列实现原理“队列”这个单词是英国人说的“排”。在英国“排队”的意思就是站到一排当中去。计算机科学中,队列是一种数据结构,有点类似
- 前言Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。它定位为轻量级Java框架
- WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush)。使用图块画笔绘制区域涉及以下三个组成部分
- 本文实例讲述了C#实现类似新浪微博长URL转短地址的方法。分享给大家供大家参考。具体如下:一、前台判断用户输入URL的JS代码如下。func
- 1、确定本地网络是通的:2、确定SpringBootq启动后是不报错的3、查看是不是自己在配置文件中加入了项目路径:如果加入了项目路径的话,
- EntityWrapper的常用方法#WHERE (issue_type = ?) AND (status = ? OR status =
- 前言日常开发中,缓存是解决数据库压力的一种方案,通常用于频繁查询的数据,例如新闻中的热点新闻,本文记录springboot中使用cache缓