【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息。
【功能设计】
1.显示学校所有地点
2.查询地点详细信息
3.查询地点间的最短路径
【逻辑设计】
1.把信息存入矩阵
sites[0] = new Site(0, "47栋", "学生宿舍-1号组团");//初始化存放地点的数组
sites[1] = new Site(1, "48栋", "学生宿舍-2号组团");
sites[2] = new Site(2, "49栋", "学生宿舍-3号组团");
sites[3] = new Site(3, "西苑食堂", "学生食堂,位于西边");
sites[4] = new Site(4, "明德园", "一片草地");
sites[5] = new Site(5, "经世楼", "教学楼-13号楼");
sites[6] = new Site(6, "明德楼", "教学楼-14号楼");
sites[7] = new Site(7, "文理大楼", "学校最高的楼");
sites[8] = new Site(8, "文体中心", "体育馆");
sites[9] = new Site(9, "笃学楼", "教学楼-16号楼");
sites[10] = new Site(10, "粮食学院", "粮食学院楼");
sites[11] = new Site(6, "计算机学院", "计算机学院楼");
sites[12] = new Site(6, "材料学院", "材料学院楼");
sites[13] = new Site(6, "东苑食堂", "学生食堂,位于东边");
2. 初始化路径长度
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;
3.用dijkstra算法求最短路径
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;
}