图的基本算法
总结图的基本存储结构,表示方式及基本算法。
包括邻接表、DFS、BFS、Prim、Kruskal、Bellman-Ford和Dijkstra等。
-
邻接表
非稠密图的标准表示称作为邻接表,将每个顶点的所有相邻顶点均保存在该顶点对应的元素所指向的一张链表中。
-
DFS
这种搜索所遵循的策略是尽可能深地搜索图,在对于最新发现的顶点中,如果它还有以此为起点的未探测到的边,就沿着此边继续探测下去。
如果这个测探结束了,就以LIFO的顺序回溯。如下图所示,marked表示是否被标记的矩阵,adj表示邻接表。
通过DFS可以获取搜索图的查找路径,如下图所示
-
BFS
广度优先算法,是Prim和Dijkstra等算法的原型。在广度优先算法中,使用与起点的距离的顺序来遍历所有点。利用Queue代替栈。
0加入队列,删除0,在队列中加入1,2,5…..
-
Prim
最小生成树主要有两种算法,一个是Prim,另一个是Kruskal。图的生成树是它的一颗含有其所有顶点的无环连通子图。
一副加权图的最小生成树是它的一颗权值最小的生成树。
利用优先队列维护需要加入最小生成树的顶点。
-
Kruskal
Kruskal更像是启发式的生长过程。根据权值排序来考察各条边,如果这条边将森林的两棵树合并起来,就把他添加到树中去,直到完全生成最小生成树。
-
Bellman-Ford
Bellman-Ford和BFS很像,所以时间复杂度相对较高,需要对每个顶点都做松弛,也不需要维护优先级队列。就是个暴力松弛过程
-
Dijkstra
Dijkstra解决的是边权重非负的加权有向图的单起点最短路径问题。最短路径其实生成的是最短路径树。如果需要获得两点之间的最短路径,只需要在优先级队列中取到t之后停止即可。可以将Dijkstra算法想象成两个集合,已达集合和未达集合,每次迭代的目的都是在未达集合中寻找一个到初始点最近的那个点。此算法是一个很典型的贪婪的例子。