地铁出行路线规划
简述
语言:java 编程工具:eclipse 编码格式:utf-8
本次实验函数通过邻接矩阵保存txt文件读入的站点路径信息,使用广度优先遍历求出最短路径
本次实验函数功能包括查询站点信息,查询线路信息,查询最短路径。
程序主体
1.建图
public int v;
public LinkedList<Integer> adj[];
public Graph(int v){
this.v = v;
adj = new LinkedList[v];
for(int i=0; i<v; ++i) {
adj[i] = new LinkedList<>();
}
}
public void addEdge(int s,int t) {
adj[s].add(t);
adj[t].add(s);
}
建一个v个顶点的无向图,并使用addEdge向邻接矩阵中添加边。
2.最短路径算法
int v=graph.getV();
LinkedList<Integer>[] adj=graph.getAdj();
boolean[] visited = new boolean[v];
visited[s] = true;
Queue<Integer> queue = new LinkedList<>();
queue.add(s);
int[] prev = new int[v];
for(int i=0; i<v;i++) {
prev[i] = -1;
}
while(queue.size() != 0) {
int w =queue.poll();
for(int i=0; i<adj[w].size();++i) {
int q = adj[w].get(i);
while(!visited[q]) {
prev[q] = w;
if(q == t) {
print(prev,s,t);
return;
}
visited[q] = true;
queue.add(q);
}
}
}
通过广度优先算法计算最短路径。
3.初始化
File file = new File("C:\\Users\\lqz\\Desktop\\站点名称.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(reader);
String line = "";
line = br.readLine();
while (line != null) {
station_name.add(line);
line = br.readLine();
}
File file = new File("C:\\Users\\lqz\\Desktop\\站点信息.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(reader);
String line = "";
line = br.readLine();
while (line != null) {
String[] sArray=line.split("\\|");
lstation_name.add(sArray[0]);
lline_name.add(sArray[1]);
lstation_num.add(sArray[2]);
}
line = br.readLine();
}
首先先将所有站点保存在一个list里,方便建图和查询。然后根据 站点名|线路号|站点序号(站点在该线路上的序号)保存路径,并且将每条线路保存在一个list里方便查询。
运行结果
1.查询站点
searchstation("苹果园");
苹果园:
1号线
6号线
searchstation("苹果");
苹果:
站点不存在
2.查询线路
searchline("大兴");
大兴号线: [公益西桥, 新宫, 西红门, 高米店北, 高米店南, 枣园, 清源路, 黄村西大街, 黄村火车站, 义和庄, 生物医药基地, 天宫院]
searchline("大");
大号线: 线路不存在
3.查询路径
new BFS().bfs(search("大井"),search("望京"),graph);
大井->七里庄(换乘9号线)->六里桥->六里桥东->北京西站->军事博物馆->白堆子->白石桥南(换乘6号线)->车公庄西->车公庄(换乘2号线)->西直门->积水潭->鼓楼大街->安定门->雍和宫->东直门(换乘13号线)->柳芳->光熙门->芍药居->望京西(换乘15号线)->望京
共21站
new BFS().bfs(search("大井"),search("大井"),graph);
两站点相同
new BFS().bfs(search("大井"),search("100"),graph);
大 站点不存在
总结
在写地铁函数前要先确定建图的方法,建图需要输入哪些数据,怎样判断输入的站点间是否存在边等问题。如果没有仔细思考就会和刚开始构思的想法不一致。所以在写函数之前应该先构思大概的方案,以及可能会遇到的问题和解决问题的方法。