what is graph
directed graph
undirected graph
图的表示形式
用m表示边的条数,n表示顶点个数。
邻接表
链表形式,边表形式
适合表示稀疏图。邻接矩阵有很多0,所以用表来表示
邻接矩阵
适合表示稠密图,每个vertice out degree多,矩阵很满。
遍历
深度优先
广度优先
并行化
使用level syncrinize. 每个iteration只扩张一个单元。
最短路问题
Single source shortest problem
从一个点出发,到其他所有点的距离。每个点储存从起点到自己的距离。
All pair shortest problem
从任意点到任一点的距离。每个点储存N-1个点到自己的距离。
floyd-warshall
只需要5行代码,很简洁。思想是插点,比如求1到3最短路,会求经过2,4,5.。。中转的距离。
- 时间复杂度:O(N^3)
- 适合 APSP问题 和数据量小的问题。
dijkstra
使用两个优先级队列(open, close)来减少重复计算。每个顶点只入队一次,出队之后进入close
- 复杂度: O(m*logn)
- 适合SSSP
- 图不能带有负权值
bellman-ford
每一个顶点对每一条边进行relax。也可以用队列来优化,即每次不遍历所有顶点,而是把队列清空就算完事。与BFS和dijkstra不同,这一轮relax之后的值有可能在之后被再次relax,出队之后可能再次进队。
- 复杂度 最坏O(MN)
- 适合SSSP
- 适合稀疏图