Graph
remarks: 从bear导入的,不可见图为草稿,重点部分都有写。
基础
1. 术语
连通图(connected graph):如果从任意一个顶点都存在一条路径到达另一个任意顶点(undirected graph)
树:是一幅无环无向连通图
森林:1个or几个树
简单路径(simple path):一条没有重复顶点的路径
简单环(simple cycle):一条(除了起点和终点必须相同之外)不含有重复顶点和边的环
adjacent: when 2 v are connected by a single edge
biconnectivity/ biconnected graph: 移除一条边也不会使graph成为unconnected的graph
subgraph(of graph G):只取G中的几个顶点构成的图
spanning subgraph:取G中所有顶点构成的图
spanning tree:是G的subgraph+是tree=由G中所有顶点构成的无环无向连通图(spanning tree不唯一)
边的分类
directed edge: 有箭头的边,eg. flight(从A点到B点)
undirected edge: 无箭头的边,eg. flight route(A和B的距离)
directed graph
undirected graph
特性
- degree sum:degree只和=2E
- maximum degree:max degree=V-1
- edge count:E <= V(V-1)/2
2. 图的表示方法
2.1 邻接矩阵
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUgPCDy8-1605523062295)(Graph/24905163-e121bc7bba6f78d1.png)]
space: O(V^2)
add edge: O(1)
check if adjacent: O(1)
iteration: O(V)
2.2 边的数组(edge lists)
eg: [ [0,1], [0, 2], [0, 5], [1, 2], [2, 3], [2, 4], [3, 4], [3, 5] ]
Edge里含两个int变量
space: O(E)
add edge: O(1)
check if adjacent: O(E)
iteration: O(E)
2.3 邻接表数组
2.3.1 例子
0: 6--->5--->2--->1
1: 3--->0
2: 0
3: 5--->1
4: 6--->5
5: 4--->3--->0
6: 7--->4--->0
7: 8--->6
8: 10--->7
9: 11--->10
10: 12--->9--->8
11: 9
12: 10
2.3.2 特点
a) 使用的空间和V+E成正比
b) 添加一条边所需的时间为常数
c) 遍历顶点v的所有相邻顶点所需的时间和v的度数成正比
d) 每条边会出现两次
2.3.3 时间复杂度
space: O(V+E)
add edge: O(1)
check adjacent: deg(v) <- vertex v
iteration: deg(v)
3. Graph实现的性能复杂度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z4nziuk-1605523062297)(Graph/Photo%20Nov%2013,%202020%20at%20105929%20PM.jpg)]
4. 深度优先(DFS)
4.1 特点
- 深度优先搜索标记与起点连通的所有顶点所需的时间和顶点的度数之和成正比
- 使用深度优先搜索得到从给定起点到任意标记顶点的路径所需的时间与路径的长度成正比
4.2 例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yShOuTgS-1605523062298)(Graph/[email protected])]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFy3SB4e-1605523062299)(Graph/[email protected])]
4.3 时间复杂度
O(V+E)
4.4 用途
- 找v和w之间是否有路径
- 找一个simple cycle
5. 广度优先(BFS)
5.1 来源
dfs遍历整个图的顺序和最短路径无关,而bfs搜索的是最短路径
5.2 特点
- 对于从s可达的任意顶点v,广度优先搜索都能找到一条从s到v的最短路径 (没有其他从s到v的路径所含的边比这条路径少)
- 广度优先搜索所需的时间在最坏情况下和V+E成正比=O(V+E)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ApqQFeQ-1605523062300)(Graph/[email protected])]
5.3 用途
- 找最短路径
6. 连通分量 connected component
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfnh5z5r-1605523062302)(Graph/20190329164255150.png)]
共三个
可利用深度优先来找出图中所有的连通分量
*深度优先搜索的预处理使用的时间和空间与V+E成正比且可以在常数时间内处理关于图的连通性查询。
7. 总结
- dfs:解决了单点连通性的问题 / 可以判定其他顶点和给定的起点是否连通
- bfs:解决了最短路径问题
Directed Graph
1. 术语
有向图:由一组顶点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点
indegree(入度):point to
outdegree(出度):point away
simple:没有重复的E / V
simple digraph的定律:E <= V(V-1)
strongly connected: every V is reachable from every other V
判断strongly connectivity的时间复杂度:O(V+E)
2. 特点
在有向图中,深度优先搜索标记由一个集合的顶点可达的所有顶点所需的时间与被标记的所有顶点的出度之和成正比
3. 有向无环图(拓扑排序)
用途:解决优先级限制下的调度问题
有向无环图(DAG):不含有向环的有向图
- 当且仅当一幅有向图是无环图时它才能进行拓扑排序
- 使用 深度优先搜索对DAG进行拓扑排序所需的时间和V+E成正比
4. 强连通性
顶点的强连通:如果两个顶点v和w是互相可达的,那么它们是强连通的
图的强连通:如果一幅有向图中的任意两个顶点都是强连通的,则称这幅有向图也是强连通的
5. Floyd-Warshall Transitive Closure
三个for loop
space: O(V^2)
runtime: O(V^3)
6. topological ordering
1. 要点
必须是DAG -> directed graph that has no cycle
2. 如何找topological ordering
见笔记
3. 时间复杂度
O(V+E)
Shortest Path
适用于加权有向图
重点解决“找到从一个顶点到达另一个顶点的权重最小的有向路径”
1. 性质
(只写了要注意的)
- 路径一定是有向的
- 并不是所有顶点都是可达的
- 负权重会使问题更复杂
- 最短路径不一定是唯一的
- 可能存在平行边和自环
2. 边的松弛
放松边v -> w意味着检查从s到w的最短路径是否是先从s -> v -> w的,如果是,那么更新数据结构的内容
3. Dijkstra(greedy approach)
3.1 概述
采用了类似Prim的类似方法来计算最短路径树
Dijkstra可以解决边权重非负的加权有向图的单起点最短路径问题。
也可以在加权无向图中找到最短路径
graph需要时connected的
3.2 应用
- 给定两点的最短路径:起点s到重点t的最短路径
- 任意顶点对之间的最短路径:同上
- 欧几里得图中的最短路径
3.3 运行时间
使用Dijkstra计算根结点为给定起点的最短路径树所需的空间与V成正比,时间与ElogV成正比 -> O(ElogV)
4. 无环加权有向图中的最短路径(拓扑排序)
4.1 用途
- 能在线性时间内解决最短路径问题
- 能够处理负权重的边
- 能够解决更多相关的问题(最长路径、并行任务调度=关键路径、相对最后期限限制下的并行任务调度)
4.2 定律
- 按照拓扑排序放松顶点,就能在和E+V成正比的时间内解决无环加权有向图的单点最短路径问题
- 解决无环加权有向图中的最常路径问题所需的时间与E+V成正比
5. 一般加权有向图中的最短路径(Bellman-Ford)
用处:
- weighted digraph
- negative weight
- compute shortest path
- determine negative weight cycle
5.1 定律
当且仅当加权有向图中至少存在一条从s到v的有向路径且所有从s到v的有向路径上的任意顶点都不存在于任何负权重环中时,s到v的最短路径才是存在的
Bellman-Ford算法所需的时间和EV成正比,空间和V成正比
5.2 原理
总结
- Dijkstra:解决边的权重非负的最短路径
- 无环加权有向图:边的权值可为负
- Bellman-Ford:解决有环 / 边的权重为负值的最短路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gcXyY28F-1605523062303)(Graph/Photo%20Nov%2013,%202020%20at%20110559%20PM.jpg)]
Minimum Spanning Tree
一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树
最小生成树仅存在于加权无向图
每幅连通图都只有一棵唯一的最小生成树(所有边权重不同)
无cycle=a tree+weight minimize
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AgJkoBgj-1605523062304)(Graph/Photo%20Nov%2013,%202020%20at%20102515%20PM.jpg)]
1. Prim
1.1 概述
只有一个顶点,会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权值最小的边加入树中
1.2 视图
最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 4:00
1.3 运行时间
- prim算法的延时实现计算MST所需的空间与E成正比,所需的时间与ElogE成正比(V个顶点,E条边)
- prim算法的即时实现计算MST所需的空间与V成正比,所需的时间与ElogV成正比
2. Kruskal
2.1 概述
把所有边和weight按大小排序,但保证不能有cycle
2.2 视图
最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 2:09
2.3 运行时间
所需的空间和E成正比,所需的时间和ElogE成正比
3. Baruvka's algorithm
分块然后选最短的路径连接
O(ElogV)
3. 切分定理
对于每一种切分,权重最小的横切边必然属于最小生成树。
4. 总结
Remarks:Prim和Kruskal不能处理有向图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYd98l3e-1605523062305)(Graph/Photo%20Nov%2013,%202020%20at%20102448%20PM.jpg)]
Reference
图的邻接矩阵的实现
无向图1——图的邻接表数组表示以及DFS、BFS搜索算法实现_大魔王-CSDN博客
【数据结构】图的连通分量HaYa-CSDN博客数据结构 连通分量
连通图和连通分量weixin_30569153的博客-CSDN博客连通分量