Bellman-Ford

· · 个人记录

\text{Bellman-Ford}

其核心是一种叫做**松弛操作`Relax()`** 的操作,**维护一点到源点的最短路径值**,即**点权值** `Relax()`有三个参数,`u`,`v`,`w`,即从`u`向`v`进行松弛操作,`w`为$edge(u, v)$的权值 ```cpp void Relax(int u, int v, int w) { dis[v] = min(dis[v], dis[u] + w); } ``` $\text{Bellman-Ford}$算法的本质是进行$|u|\times(|v|-1)$次**松弛操作**,有两层循环 ```cpp for(int i = 0; i < n + 1; i++) { //经过i个点(不含起点)到达的个点的最短路径 for(int j = 0; j < G[i].size(); j++) { //遍历每条边 Relax(i, G[i][j], W[i][j]); // G表示vector存边,W表示vector存权值 } } ``` 执行过程图: ![1](https://cdn.luogu.com.cn/upload/image_hosting/13n2qds1.png) ![2](https://cdn.luogu.com.cn/upload/image_hosting/3q0urgnd.png) ![3](https://cdn.luogu.com.cn/upload/image_hosting/vj61p32p.png) ![4](https://cdn.luogu.com.cn/upload/image_hosting/1vdhugzy.png) 对于前i个点,每个点向外松弛,所得到的下一个阶段的点一定是当前最优的 $\text{Bellman-Ford}$的优化算法:[$\text{spfa}$](https://www.luogu.com.cn/blog/ThereMust/post-spfa)