图
基本概念
- 简单路径: 除了第一个和最后一节点之外,路径中其他定点均不相同的路径。
- 邻接矩阵: A(i,j) 代表存在从点 i 到点 j 的边。 无向图的邻接矩阵是对称矩阵。
图的遍历
- 广度优先 BFS
- 深度优先 DFS
拓扑排序
不断将入度为 0 的点输出到 theOrder中,
当一个点被输出时,其邻接到的点的入度相应 -1.
单源点最短路问题
Dijkstra 算法
-
按照路径长度递增顺序产生最短路
-
在目前已经产生的每条最短路径中,考虑加入一条边到达未产生最短路径的目的顶点,再从这些新路径中选择最短的。
-
简单复杂度 O(n2)
-
优化后O((n+m) log n)
最小生成树
Kruskal 算法
- 按照边权大小,从小到大顺序来考虑边
- 当考虑某条时,若将其加入到已选边集中会出现环路,则将其抛弃,否则将他选入。
- 时间复杂性: O(n + eloge)
Prim 算法
每次从可达的,且不会构成环的边中选择代价最小的边。
Floyd 算法
求所有顶点对之间的最短路
c
(
i
,
j
,
k
)
c(i,j,k)
c(i,j,k) :从 i 到 j, 中间定点曲子集合{1, 2, …,k}的最短路长度
c ( i , j , k ) = m i n { c ( i , j , k ) , c ( i , k , k − 1 ) + c ( k , j , k − 1 ) } c(i,j,k) = min \{c(i,j,k), c(i,k,k-1)+c(k,j,k-1)\} c(i,j,k)=min{c(i,j,k),c(i,k,k−1)+c(k,j,k−1)}
- 时间复杂度 O(n3)