Dijkstra 算法虽然好,但是他不能解决带有负权边的(边的权值为负数)的图,下面我们就来说一下几乎完妹求最短路径的算法Bellman-ford。Bellman-ford算法也非常简单,核心代码只有几行,并且可以完美的解决带有负权的图,先来看看这个核心代码吧
for(int k = 1 ; k <= n - 1 ; k ++)
{
for(int i = 1 ; i < m ; i ++)
{
if(dis[v[i]] > dis[u[i]] + w[i])
dis[v[i]] = dis[u[i]] + w[i] ;
}
}
这个算法的名字叫做
中文名 贝尔曼-福特算法
外文名 Bellman - Ford algorithm
上边的代码外循环共循环了n - 1 次(n为顶点的个数),内循环共循环了m次(m代表边的个数)即枚举每一条边, dis 数组是的作用和dijkstra 算法一样,也是用来记录源点到其余各个顶点的最短路径,u,v,w 三个数组用来记录边的信息。例如第i条边存储在u[i]、v[i]、w[i]中,表示从顶点u[i]到顶点v[i]这条边(u[i] --> v[i])权值为w[i]。
两层for循环的意思是:看看能否通过u[i]--->v[i] (权