bellman_ford算法和dijkstra算法很像但是有本质的区别
dijkstra是将从最新的最小点出发更新所有点到起点的距离dist,而bellman_ford的for循环是把所有边的终点的最短距离更新一次,如果k = 1的话当然跟dijkstra没有什么区别,然而随着k值的增大,同一点的dist最小值可能发生变化。
而bellman_ford算法和dijkstra算法的很大的区别就在于bellman-ford算法需要备份,保证只用上一次的结果更新下一次的距离,从而保证 <= k 的条件
void bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
for (int i = 0; i < k; i ++ )//循环k次
{
memcpy(last, dist, sizeof dist);//备份上一次的结果
for (int j = 0; j < m; j ++ ) //遍历所有边
{
auto e = edges[j];
dist[e.b] = min(dist[e.b], last[e.a] + e.c);
}
}
}