RIP使用Bellman-Ford算法
在开始之前呢,我们先了解一下Bellman-Ford算法吧!
Bellman-Ford算法(Dijstra算法也是)是来自于动态规划。动态规划的两点特征:最优子结构和重叠子问题。
首先是最优子结构问题:
最短路径的子路径也是最短路径:从vi经过vj到vk的最短路必须要经过的子路径vj到vk的最短路和子路径vi到vj的最短路,就是说两个子路径必须都是最短路,他们之和才有可能是最短路径。
其次是重叠子问题:
如果我们要求从vi到vz的最短路径,那么我们也要求出从vi到vj,直至 vy的最短路径,每一次求解的过程中都会出现重叠的子问题。比如,求从vi经过vj到vk的最短路,就需要先求得vi到vj的最短路,这就是vi到vk的子问题,而且这个子问题不只出现在当前vi
到vk点最短路的问题中,也会出现在vi到vj最短路的问题中,他们的子问题就是重叠的。
由此我们得到动态规划的动态转移方程:
dist[eage[j].v] = min(dist[eage[j].v] ,dist[eage[j].u] + eage[j].w)
eage[j].v表示的是v点,eage[j].u表示的是u点,eage[j].w表示从v到u的距离;
而dist[]数组表示从源点s到当前点的最短路径长度。
这就是松弛操作,而证明如下:
假设从源点s到定点v的最短路径是dist[v],加入存在从源点一条经过点u到达v的路径dist[j]+w,并且dist[j]+w比dist[v]更短,这和最短路径相矛盾,那么要对最短路径进行更新。
以下是bellman-ford的表述:
数据结构:
struct {
int u, v;
int w;
}eage[MAX_SIZEE] = {
0};
int dist[MAX_SIZEN];//访问记录
算法: