那天在MOP上看到一篇文章,是求助一个最短航线算法的。恰好最近自已在做的一个项目也要用到有关树的储存与遍历方面的算法,就熬了一夜,编程来实现了。回忆起来以前学习过的数据结构,现在看来真的很有用。大学毕业后所做的工作,不外是把编程能力锻炼的更强,写代码比以前更快,思路更清晰,然而回到算法这个问题上,还是逃不过大学时所学,很有感慨,窃喜上大学的时候并没有把数据结构丢掉,学的还算用心。回想起来以前以及现在编程的时候,嗨,那真是激情燃烧的岁月啊。写文纪念一下。
题目要求:
二、 课程设计题目
最佳飞机换乘线路查询系统
[问题描述]
作为最佳飞机换乘线路是根据拥护给出的起点和终点,寻找一条换乘次数最少或花费路线最少的线路方案。显然,飞机客运网应该用一个有向图(或无向图)描述。图中的顶点表示城市(车站)名,若从顶点A到达城市B有一躺直达的班机,在图中就有一条由A到B的弧,弧上的权值表示机票价格。
[基本要求]
1、 最佳飞机换乘线路是根据换乘次数最少还是路费最少,是由拥护在运行时选定;
2、 当输入合法的上下飞机的站名时,系统将输出换乘的班机信息和所有的换乘站名;
3、 飞机线路信息用文件存储,可以随时添加新线路或删除某条已有的线路。
[测试数据]
将飞行线路信息从文件中读取进来,并由此构造文件。
[提示]
本题目的主要数据结构包括图和线性表,以及准备输出数据所用到的辅助数据结构。搜索最短路径可以考虑使用BFS方法
我的实现方法如下:
1.创建航线Object。它有开始城市,终了城市,航线价格,飞机机型这些信息。其中,开始城市和终了城市是一定要有的,因为此图就靠它来存储了,一个图只需要存上它的每条边就OK,一条边不外乎就是两个点就可以定义,所以开始城市和终了城市是必须的。多说一句,我在这里指定了开始点和终了点,那么很明显这是个有向图,其实无向图和有向图在数据结构的存储上是没有必然的区别的,都可以用开始点和终了点的概念来存,大不了无向图就是一条边存两遍罢了。从A到B存一次,从B到A再存一次,这就是无向图。航线价格和飞机机型不是存储一个图所必须的,然而在题中为了算路费,航线价格是必不可少的,飞机机型是这为了好看,随便弄上去的一个航线的属性。当然,还可以为航线再增加其他的属性,都放在这个Object里,按下不表。
代码如下:
import java.math.BigDecimal;
/*
* 作成日: 2006-2-24
*
*/
/**
* @author Administrator
*
* 航线Object
*/
public class AirLine {
//开始城市
private String startCity;
//终了城市
private String endCity;
//航线价格
private BigDecimal airLinePrice;
//飞机机型
private String airplaneType;
/**
* @return
*/
public String getEndCity() {
return endCity;
}
/**
* @return
*/
public String getStartCity() {
return startCity;
}
/**
* @param string
*/
public void setEndCity(String string) {
endCity = string;
}
/**
* @param string
*/
public void setStartCity(String string) {
startCity = string;
}
/**
* @return
*/
public BigDecimal getAirLinePrice() {
return airLinePrice;
}
/**
* @param decimal
*/
public void setAirLinePrice(BigDecimal decimal) {
airLinePrice = decimal;
}
/**
* @return
*/
public String getAirplaneType() {
return airplaneType;
}
/**
* @param string
*/
public void setAirplaneType(String string) {
airplaneType = string;
}
}
2.创建航线业务系统Object。对于最佳飞机换乘线路这个问题的解决,一般来说有两种方案:1)用图的深度优先算法,先找到所有的路线,再对所有的路线进行判断,看哪个路线换乘次数最少,哪条路线路费最少;2)用图广度优先算法,也就是相当于按层次来遍历这个图,这样找到了最短的路径就可以不再找了,适合于找换乘次数最少的路线,但是要找到路费最少的路线,还得整个遍历这个图才行。综合考虑之,我为了编程方便,就采用了第一种算法来实现,尽管这种算法不是速度最快的算法,但是实现起来最方便。先找到所有路径,再根据用户的选择来计算出最少换乘路线或是最便宜换乘路线。此算法用图的深度优先算法找到所有的路径,用递归来实现。以下代码中,核心的算法是public List allAirLine(String startCity, String endCity, List airLineList) 和 private void searchNextLine( String startCity,String endCity,List airLineList, List lineList,List allLineLists,List circulationPrevent),其他属于接口方法和辅助方法。
代码如下:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/*
* 作成日: 2006-2-24
*
*/
/**
* @author Administrator
*
* 航线业务系统
*/
public class AirSystem {
//最短换乘航线计算
public List shortAirLine(List allLineLists) {
//最短换乘航线
List shortAirLineList = new ArrayList();
//所有换乘航线数为零
if (allLineLists == null || allLineLists.size() == 0) {
return shortAirLineList;
}
for (int i = 0; i < allLineLists.size() - 1; i++) {
for (int j = 0; j < allLineLists.size() - 1 - i; j++) {
List list1 = (List) allLineLists.get(j);
List list2 = (List) allLineLists.get(j+1);
if (list1.size() > list2.size()) {
allLineLists.set(j, list2);
allLineLists.set(j+1, list1);
}
}
}
shortAirLineList = (List) allLineLists.get(0);
return shortAirLineList;
}
//最便宜换乘航线计算
public List cheapAirLine(List allLineLists) {
//最便宜换乘航线
List cheapAirLineList = new ArrayList();
//所有换乘航线数为零
if (allLineLists == null || allLineLists.size() == 0) {
return cheapAirLineList;
}
for (int i = 0; i < allLineLists.size() - 1; i++) {
for (int j = 0; j < allLineLists.size() - 1 - i; j++) {
List list1 = (List) allLineLists.get(j);
List list2 = (List) allLineLists.get(j+1);
BigDecimal price1 = airLinePrice(list1);
BigDecimal price2 = airLinePrice(list2);
if (price1.compareTo(price2) > 0) {
allLineLists.set(j, list2);
allLineLists.set(j+1, list1);
}
}
}
cheapAi