最短路
一、单源最短路
1、边为正值
①朴素dijkstra :适用于稠密图,eg(1<N<500,1<M<1e5) 邻接表存图
②堆优化dijkstra :适用于稀疏图,点数与边数差不多,eg(1<N,M<1e5)
2、边可能有负值
①bellman_ford :有边数限制的图 存图方式随意 可用结构体链表
②spfa:应用广泛,可判负环。
二、多源最短路
floyd:三重循环,本身是个动态规划算法,在代码实现的时候省去了一维状态。
原状态是:f[i, j, k]表示从i走到j的路径上除了i, j以外不包含点k的所有路径的最短距离。那么f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。
因此在计算第k层的f[i, j]的时候必须先将第k - 1层的所有状态计算出来,所以需要把k放在最外层。