- 图 graph
- 图的基本概念
- 分类存储
- 遍历
- 最短路径算法
- 最小生成树
- 例题讲解(对于面试很复杂,所以题量少,)
- 图论
- 图的组成。顶点+边
vertex:度degree(与他连接的点的个数之和)入度(所有接入该点的边数之和)和出度(outdegree)
边(edge)
- 图的分类
有向图和无向图。
有权图(每条边具有一定的权重(weight))和无权图(无权重或者权=1)。
有环图(如果遍历图的顶点,某个顶点可以被访问超过一次)和无环图(tree)。 (这是有向图的分类)
连通图(任意两个顶点都是连通)和非连通图(存在两个顶点不连通)和完全图(所有顶点和其他顶点是连通的)
- 图的存储方式
n个顶点的图有一个n*n大小的邻接矩阵,
一个无权图中1代表两点联通,0代表不连通
有权图中每个元素代表权重,0代表不相连。
无向图中,邻接矩阵关于对角线相等。
稠密图适合邻接矩阵,稀疏图适合邻接链表
邻接链表:每一个点存储一个链表指向所有与该店直接相连的点。 (增加或者删除复杂度更小)
有权图中链表中的元素值对应着权重
- 图的遍历
操作有+-vertex。
DFS:访问顶点v,依次v未被访问的邻接点出发,深度优先遍历,直至途中和v有路径相同的顶点都被访问。使用stack
若此时仍有顶点未被访问,则重新开始DFS
BFS:使用queue。从队列中取出一个节点然后直接将所有未检验子节点push到queue中。
可以用来解决最短路径的问题。但是需要存储的信息量很大。
对于稀疏图来说,DFS容易陷进去最长的一支分路。
但是每一层数量过多,BFS也容易耗时。
总体来说,倾向于dfs,内存小,解决问题更多一点
例题:lc133. clone graph。42min处
- 最短路径算法。
- dijistra算法
适用于非负权值的单源最短路径,斐波那契堆。
使用BFS。
- bellman-ford算法
无负权回路(一个回路的权值相加为负)的图每对节点之间的单源最短路径,并能检测负圈。
- floyd算法
权值有负的单源最短路径,但不能有负圈回路
- SPFA算法
有负权值,且欸有负圈的图的单源最短路径。
LC743 network delay time 1h53min,直接可以用dikistra
Lc787。bellman-ford或者BFS。kstop可以直接停
- 最小生成树。
- kruskal算法,prim算法
kruskal算法,