权重图:图中的每条边都带有一个权重的图。
权重值通常以权重函数 ω:E→R 给出。
邻接表
邻接矩阵
Kruskal算法找安全边的方法:在所有连接森林中两棵不同树的边中,找权重最小的边(u,v)。
时间复杂度:O(E lg E)
Prim算法的每一步是在连接集合A和A之外的结点的所有边中,选择一条轻量级边加入到A中。所加入的边对于A也是安全的。
Prim算法的基本性质:集合A中的边总是构成一棵树。
Prim算法的时间复杂度:O(V lg V +E lg V )=O(E lg V )。
给定一个图G=(V,E),找出从给定的源点s∈V到其它每个结点v∈V的最短路径。
最短路径的最优子结构
? 最短路径具有最优子结构性:两个结点之间的一条最短路径的任何子路径都是最短的。
引理24.1 给定一个带权重的有向图G=(V,E)和权重函数ω:E→R。设p=<v0,v1,…,vk>为从结点v0到结点vk的一条最短路径,并且对于任意的i和j,0≤i≤j≤k,设pij=<vi,vi+1,…,vj>为路径p中从结点vi到结点vj的子路径,则pij是从结点vi到结点vj的一条最短路径。
Bellman-ford算法总的运行时间O(VE)。
如果用线性数组实现,每次找d最小的结点u需要O(V)的时间,所以算法的总运行时间为O(V2+E)=O(V2)。
技巧:
vj
到vi
有一条权值为bk
的有向边。v0
到各个结点的单源最短路径。
矩阵乘法的修改。
简记:遍历k,比较ik+kj。在矩阵中画十字,看两边比较。
算法描述:
Wn╳n:权重邻接矩阵;
Dn╳n:最短路径权重矩阵
FLOYD-WARSHALL自底向上地完成D矩阵的计算。