有边数限制的最短路
在只能经过有限边数的限制之下,想要求出最短路问题使用的算法是Bellman-Ford算法
比如这题:853. 有边数限制的最短路 - AcWing题库
控制边数的方法是限制循环的次数,而不是像dijkstra算法那样讲所有的边都遍历一遍。但是有一点需要注意,由于结点的更新,可能会发生局部深搜。如图:
这样一个有向图,首先会更新2点的值,2的值被更新后就会继续更新3的值。为了防止这种事的发生,可以在所有值先复制到另一个数组中,用那个数组更新。
void bellman_ford()
{
memset(dist,0x3f,sizeof dist);//存储每个结点距离的数组
dist[1] = 0;
for(int i = 0;i < k;i++) //循环k次,即边数限制次数
{
memcpy(d,dist,sizeof d);//将临时存储的数组赋值
for(int j = 0;j < m;j++)
{
auto e = edge[j];
dist[e.b] = min(dist[e.b],d[e.a] + e.c);
}
}
}
如此即可。