@[TOC]
图算法
1、图的表示
1.1、邻接矩阵(有向图、无向图、带权图、代码实现)
1、无向图的邻接矩阵
2、有向图的邻接矩阵
3、带权值的图
有了上述的理解,我们可以设计数据结构,并实现了。C++实现如下:
#include
1.2、 邻接表
1、邻接表的提出
2、无向图的邻接表
3、有向图的邻接表(分出边表、入边表)
4、带权图的处理
有了上面的邻接表的理解,我们可以实现代码(java):
package
1.3、 十字链表与邻接多重表
1、十字链表——解决有向图邻接表结构缺点
2、邻接多重表——解决无向图邻接表结构,边的删除麻烦问题
1.4、边集数组
2、图的遍历
2.1、DFS(深度优先搜索、递归算法)
基于邻接矩阵的DFS
template
由于是邻接矩阵存储结构,算法时间复杂度O(n^2^)
基于邻接表的DFS
template
邻接表使得算法复杂度为O(n+e),n为顶点个数,e为边数。
2.2、BFS(宽度优先搜索、优先队列)
对边搜索、不断延展。 邻接矩阵的BFS
void
邻接表的BFS
void
2.3、小结
3、寻找最小生成树(两个贪心算法)
实际问题:
3.1、Prim算法(分割法、贪心策略:寻找集合中的顶点所连接边中最小权值边)
贪心策略、算法分析:
template
3.2、 Kruskal算法(边集数组、每次从剩余边选择最小权值边)
图解分析:
基于分析我们可以写出代码:
template
运行结果:
4、最短路径问题
4.1、单源最短路径问题(给定一个点,求到其余各个点的距离)
4.1.1、迪杰特斯拉(Dijkstra)算法(贪心算法)
很像prim算法,利用集合,寻找最短路径。但是有区别。而且用途也不同。这是一个贪心算法。
基于理解上的算法实现 :
template
未优化的算法复杂度很高