一个例子,关于航班线路的深度优先搜索

  1 java 代码,摘自《java 编程艺术》
  2
  3 /**
  4 * 航班信息类
  5 * 用于存放航班线路
  6 * @author shiyan
  7 *
  8 */
  9 public class FlightInfo {
 10 String from;//出发城市
 11 String to;//目的城市
 12 int distance;//距离
 13 boolean skip;//回退标志
 14 public FlightInfo(String f,String t,int d){
 15 this.from=f;
 16 this.to=t;
 17 this.distance=d;
 18 skip=false;
 19 }
 20 }
 21
 22
 23
 24 import java.io.BufferedReader;
 25 import java.io.IOException;
 26 import java.io.InputStreamReader;
 27 import java.util.Stack;
 28
 29 /**
 30 * 深度优先搜索
 31 * @author shiyan
 32 *
 33 */
 34 public class Depth {
 35 final int Max=100;
 36 FlightInfo flights[]=new FlightInfo[Max];//航班信息
 37 int numFlights=0;//实际航班个数
 38 Stack btStack=new Stack();//回退标志
 39 public static void main(String[] args){
 40 String to,from;
 41 Depth ob=new Depth();
 42 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 43 ob.setup();
 44 try{
 45 System.out.println("From? ");
 46 from=br.readLine();
 47 System.out.print("To? ");
 48 to=br.readLine();
 49
 50 ob.isFlight(from, to);
 51 if(ob.btStack.size()!=0)
 52 ob.route(to);
 53 }catch(IOException e){
 54 System.out.println("Error on input.");
 55 }
 56 }
 57 public    void setup(){
 58 addFlight("纽约","芝加哥", 900);
 59 addFlight("芝加哥","丹佛", 1000);
 60 addFlight("纽约","多伦多", 500);
 61 addFlight("多伦多","卡尔加里", 1800);
 62 addFlight("纽约","丹佛", 1700);
 63 addFlight("多伦多","洛杉机", 2500);
 64 addFlight("多伦多","芝加哥", 500);
 65 addFlight("丹佛","乌儿巴纳", 1000);
 66 addFlight("丹佛","休斯顿", 1000);
 67 addFlight("休斯顿","洛杉机", 1500);
 68 addFlight("丹佛","洛杉机", 1000);
 69 }
 70
 71 public void addFlight(String from,String to,int dist){
 72 if(numFlights<Max){
 73 flights[numFlights]=new FlightInfo(from,to,dist);
 74 numFlights++;
 75 }else
 76 System.out.println("Flight database full.");
 77 }
 78 /**
 79 * 确定两个城市之间是否有航班,有则返回距离,没有则返回0
 80 * @param from
 81 * @param to
 82 * @return
 83 */
 84 public int match(String from,String to){
 85 for(FlightInfo flight:flights){
 86 if(flight!=null){
 87 if(flight.from.equals(from) && flight.to.equals(to) && !flight.skip){
 88 flight.skip=true;//避免再次使用
 89 return flight.distance;
 90 }
 91 }
 92 }
 93 /*for(int i=0;i<numFlights;i++){
 94 if(flights[i].from.equals(from) && flights[i].to.equals(to) && !flights[i].skip){
 95 flights[i].skip=true;
 96 return flights[i].distance;
 97 }
 98 }*/
 99 return 0;
100 }
101
102 /**
103 * 查询from有没有到其他任何城市的航班
104 * @param from
105 * @return
106 */
107 public FlightInfo find(String from){
108 for(FlightInfo flight:flights){
109 if(flight!=null){
110 if(flight.from.equals(from) && !flight.skip){
111 FlightInfo f=new FlightInfo(flight.from,flight.to,flight.distance);
112 flight.skip=true;//避免重复使用
113 return f;
114 }
115 }
116 }
117 return null;
118 }
119
120 /**
121 * 查询两个城市之间线路
122 * @param from
123 * @param to
124 */
125 public void isFlight(String from,String to){
126 int dist;
127 FlightInfo f;
128 dist=match(from,to);
129 if(dist!=0){//有直达
130 btStack.push(new FlightInfo(from,to,dist));
131 return;
132 }
133 f=find(from);
134 if(f!=null){
135 btStack.push(new FlightInfo(from,to,f.distance));
136 isFlight(f.to,to);
137 }else if(btStack.size()>0){
138 //回退,尝试其它路径
139 f=(FlightInfo) btStack.pop();
140 isFlight(f.from,f.to);
141 }
142 }
143
144 /**
145 * 显示路径和总长度
146 * @param to
147 */
148 public void route(String to){
149 Stack rev=new Stack();
150 int dist=0;
151 FlightInfo f;
152 int num=btStack.size();
153
154 //反转btStack(里面的路径是相反的,栈的顶部保存的是最后一个航班信息,底部是第一个航班信息),从起点到终点显示路径将路径压栈rev中
155 for(int i=0;i<num;i++){
156 rev.push(btStack.pop());
157 }
158
159 for(int i=0;i<num;i++){
160 f=(FlightInfo)rev.pop();
161 System.out.print(f.from+" to ");
162 dist+=f.distance;
163 }
164 System.out.println(to);
165 System.out.println("Distance is "+dist);
166 }
167
168 }
169
170  
时间: 2024-11-08 18:28:17

一个例子,关于航班线路的深度优先搜索的相关文章

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然

sicily 1050 深度优先搜索解题

1050. Numbers & Letters Constraints Time Limit: 3 secs, Memory Limit: 32 MB Description In the early 80’s, a popular TV show on Dutch television was ‘Cijfers en Letters’ (Numbers and Letters). This game consisted of two game elements, in which the ma

深度优先搜索的图文介绍

1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止. 显然,深度优先搜索是一个递归的过程. 2. 深度优先搜索图解 2.1 无向图的深度优先搜索

深度优先搜索、广度优先搜索

1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止. 显然,深度优先搜索是一个递归的过程. 2. 深度优先搜索图解 2.1 无向图的深度优先搜索

图的遍历之深度优先搜索和广度优先搜索

转自:http://www.cnblogs.com/skywang12345/ 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访

深度优先搜索(DFS: Depth First Search)

深度优先搜索是一种树的遍历方式.与此对应的是广度优先搜索. ? 二叉树的优先搜索: ? 如何把一个数学问题转换为树的深度优先搜索问题: 例如:各位数之和为偶数的一个10位二进制数有几个. 我们来分析一下这个问题,首先一共有10位数,然后每一位数都只有两种状态0,1 这可以看做是一个深度为10的一个二叉树,然后用树的深度优先搜索即可解决问题. ? 用C语言实现的代码结构 void DFS(int depth) { ????if(depth==10)????????//递归出口 ????{ ????

深度优先搜索---一个懵逼的东东

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.(来自百度百科) 先解释以下深度: 深度指在搜索的过程中沿着一条路一直向下进行,直到这条路没有下一个节点停止,然后返回到上一步接着进行上述操作 所以深度优先搜索的整体结构就是: 1.递归2.剪枝 可能这样说有点不清楚,举个例子 打印1-4的全排列开头为1和2的所有序列; 1 2 3 4 1 2 4 3 1 3 2 4 1 3

深度优先搜索-linux上浅显易懂的例子

上次看啊哈算法中的深度优先搜索,自己用的是linux(linux粉,windows黑,嘿嘿),字符界面,为了强化对这个的理解,就在linux上对这个例子的代码做了一点修改可以很清楚的看到整个搜索过程,相当于动态的展示吧,虽然不是动画,本来想用QT来写的,不过实在是没时间(其实是QT太久没用了.....) 深度优先搜索说到底就是一条道走到黑直到达到目的,然后再往回走,看看上次选择的地方是否还有别的路可以选择走.代码中定义了宏MAX_NUM=8, 就是8x8的迷宫, 用户输入开始点和结束点,找到开始

图的遍历之深度优先搜索(DFS)

深度优先搜索(depth-first search)是对先序遍历(preorder traversal)的推广.”深度优先搜索“,顾名思义就是尽可能深的搜索一个图.想象你是身处一个迷宫的入口,迷宫中的路每一个拐点有一盏灯是亮着的,你的任务是将所有灯熄灭,按照DFS的做法如下: 1. 熄灭你当前所在的拐点的灯 2. 任选一条路向前(深处)走,每经过一个拐点将灯熄灭直到与之相邻的拐点的灯全部熄灭后,原路返回到某个拐点的相邻拐点灯是亮着的,走到灯亮的拐点,重复执行步骤1 3. 当所有灯熄灭时,结束 将