public static void printRoutes(String day,String source,String place1, String place2, boolean[] visited, LinkedList<Edge> Route,Grafo g) {
int index = hash.get(place1);
visited[index] = true;
if(place1.equals(place2))
if(isTransferable(day,Route,source))
writeRoute(Route,source);
if(place1 != place2) {
LinkedList<Edge> adjs = g.adjs_no(place1);
for(Edge a: adjs) {
if(!visited[hash.get(a.node_final)]) {
Route.add(a);
printRoutes(day,source,a.node_final,place2,visited,Route,g);
Route.remove(a);
}
}
}
visited[indice] = false;
}
public static void writeRoute(LinkedList<Edge> Route,String source) {
System.out.print(source + " -> ");
for (int i = 0; i < Route.size(); i++) {
System.out.print(Route.get(i).vertex_final() + " | Flight Number:");
System.out.print(Route.get(i).flight.flightNumber + " | Departure Time:" + Route.get(i).flight.departureTime);
System.out.println();
if(i != Route.size()- 1)System.out.print(Route.get(i).vertex_final() + " -> ");
}
System.out.println();
System.out.println();
}
我想用广度优先搜索而不是DFS来回答这个问题,这样较短的行程就会首先出现。但是,我对BFS的算法对多图不起作用。有没有一种方法可以在这个图上执行BFS,这样我就可以成功地打印出给定一天两个城市之间所有可能的行程?
重要的是要了解,您的数据并不完全形成一个多图的目的,您的路线搜索算法。这是因为可以从给定节点遍历的出站边取决于通过哪个入站边到达该节点。这就是DFS需要istransferable()
方法的原因。
相反,您所拥有的将更好地描述为一个普通图的紧凑表示,其中的节点表示(城市、到达航班、航班日期)三元组。或者因为每个航班都有一个目的地,所以每个节点的特征数据实际上只是到达航班和日期。或者,如果您将这些数据分割成一个单独的图,那么每个节点的特征数据都是到达航班。
考虑到这一点,您应该能够使普通的BFS算法适应您的数据表示。您现有的istransferable()
方法可以提供帮助,但关键是适当地标识节点(通过入站航班,而不是(直接)通过城市)。
主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以
我正在尝试在有向图上实现BFS。我完全确定我的算法是正确的,但是,下面的代码段返回错误: 图表。CPP文件: 以及在以下方面的实际BFS实施: 因此,除了源节点之外,队列中的其他节点都给出了错误的邻接列表。虽然队列顺序运行良好,但队列中的节点给出了错误的邻接。 我不确定为什么会发生这种情况,虽然我怀疑这是由于按值复制节点而不是引用。 这是我在很长一段时间后的CPP计划,所以如果我错过了什么,请启发
我正在研究BFS算法,我有一个关于如何将相邻节点插入队列的问题。 例如,假设我们正在处理一个无向图,我们希望执行BFS来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。
我有一个无向连通图。我使用邻接矩阵实现了它,它是一个2维数组。 据我所知,DFS在兄弟节点之前访问子节点。BFS先于孩子探望兄弟姐妹。 这两个我是这样实现的: 如果让我执行一个从D到E的DFS,是D、C、a、E还是D、E。我以为DFS和BFS必须访问每个节点,在这种情况下B不能访问。我不知道我应该如何改变我目前的方法来满足这些要求。
BFS 全称是 Breadth First Search,中文名是宽度优先搜索,也叫广度优先搜索。是图上最基础、最重要的搜索算法之一。 所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径。换言之,这条路径所包含的边数最小。 在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。 (1)
图 图是一种数据结构,其中节点可以具有零个或者多个相邻的元素,两个节点之间的连接成为边。节点也可以成为顶点。 邻接表: 邻接表一般采用数组+链表的形式,数组表示各个顶点,链表中的元素表示该顶点与链表中的元素相连,与链表本身的指针没有关系。如上图 数组0 对应的链表1->3->4 表示0这个顶点与1 3 4这个顶点连接 数组1 表示1这个顶点与 0 2 4顶点相连以此类推 邻接矩阵和邻接表的区别 邻