一、问题分析
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息.
二、类设计
Dijkstra算法类:用于实现Dijkstra算法
getSpotsInfo类:用于存放和查询景点信息
main类:主类
三、设计
这里我使用的是老师给的无向图
四、部分代码
static class Dijkstra{
/**
* 查找最短路径
* @param vertexs 顶点集合
* @param matrix 边权值集合
* @param start 远点的起始位置
*/
public void DijksteaDemo(String[] vertexs,int[][] matrix,int start,int end){
int n= matrix.length; //记录顶点个数
int[] bis=new int[n]; //保存起始点到各个顶点的最短路径
//标记当前顶点是否被访问
int[] isVisited=new int[n];
//记录最短路径的顶点
String[] path=new String[n];
//初始化标记路径,假设一开始原点可以走过所有的路径
for(int i=0;i<n;i++){
path[i]=new String(vertexs[start]+"-->"+vertexs[i]);
}
//第一个顶点已经被访问,且路径为0
bis[start]=0;
isVisited[start]=1;
for(int i=1;i<n;i++){
//当前尾部的路径下标
int u=-1;
//寻找最小权值
int minDis=Integer.MAX_VALUE;
//找到当前原点到所有顶点中的最短路径并记录下标
for(int j=0;j<n;j++){
if(isVisited[j]==0 && matrix[start][j]<minDis){
minDis=matrix[start][j];
u=j;
}
}
bis[u]=minDis;
isVisited[u]=1;
//以u为中介,找到最短路径w(u,v),此时就能得到w(s,v)的最短路径
for(int k=0;k<n;k++){
//dis[u]+matrix[u][i] < matrix[start][i]
//如果存在一条w(u,v)的边,那么s到v的一条新路径为dis[n]+w(u,v)
//如果这个值比当前的dis[v]小,那么交替
if(isVisited[k]==0 && matrix[start][u]+matrix[u][k]<matrix[start][k]){
matrix[start][k]=matrix[start][u]+matrix[u][k];
path[k]=path[u]+"-->"+vertexs[k];
}
}
}
System.out.println(path[end]+"的最短路径为:"+bis[end]);
}
}
这里我贴出了Dijkstra算法的详细实现过程,其余就不再展示。