图
无向图
-
深度优先搜索查找(DFS):
-
添加了一个数组edgeTo[]。这个数组可以找到每个与s连通的顶点回到s的路径。它会记住每个顶点到起点的路径,而不是记录当前顶点到起点的路径。为了做到这一点,在由边v-w第一次访问任意w时,将edgeTo[w]设为v来记住这条路径。换句话说,v-w是从s到我的路径上的最后一条已知的边。这样,搜索的结果是一棵以起点为根节点的树,edgeTo[]是一棵父链接表示的树。
-
深度优先搜索标记与起点连通的所有顶点所需的时间和顶点的度数之和成正比
-
-
广度优先搜索查找(BFS):
-
深度优先搜索得到的路径不仅取决于图的结构,还取决于图的表示和递归调用的性质。广度优先搜索可以用来解决单点最短路径问题。深度优先搜索就好像是一个人在走迷宫,广度优先搜索则好像是一组人在一起朝各个方向走这个迷宫,每个人都有自己的绳子。当出现新的的叉路时,可以假设一个探索者可以分裂为更多的人来搜索它们,当两个探索者相遇时,会合二为一(并继续使用先到达者的绳子)。在程序中,在搜索一幅图时遇到有多条边需要遍历的情况时,我们会选择其中一条并将其他通道留到以后再继续搜索。在深度优先搜索中,我们我们用了一个可以下压的栈(这是由系统管理的,以支持递归搜索方法)。使用LIFO(后进后出)的规则来描述压栈和走迷宫先探索相邻的通道相似。从有待搜索的通道中选择最晚遇到过的那条。在广度优先搜索中,我们希望按照与起点的距离的顺序来遍历所有顶点,看起来这种顺序很容易实现:使用(FIFO,先进先出)队列来代替栈(LIFO,后进先出)即可。我们将从有待搜索的通道中选择最早遇到的那条。
-
对于从s可达的任意顶点顶点v,广度优先搜索都能找到一条从s到v的最短路径(没有其他从s到v的路径所含的边比这条路径更少)。广度优先搜索所需的时间在最坏情况下和V+E成正比。
-
这两个算法的不同之处仅在于从数据结构中获取下一个顶点的规则(对于广度优先搜索来说是最早加入的顶点,对于深度优先搜索来说是最晚加入的顶点)。
-
有向图
-
拓扑排序:
-
给定一幅有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排到后面的元素(或者说明无法做到这一点)。如果一个有优先级限制的问题中存在有向环,那么这个问题肯定是无解的。
-
有向图中基于深度优先搜索的顶点排序:
private Queue<Integer> pre; //所有顶点的前序排列 private Queue<Integer> post; //所有顶点的后序排列 private Stack<Integer> reversePost; //所有顶点的逆后序排列,即拓扑排序 public DepthFirstOrder(Digraph G) { pre = new Queue<Integer>(); po
-