Link-State链路状态路由算法又被称为Dijkstra算法,可计算在网络中从一个节点到所有其他节点的最短路径,特性是经过k次循环可以得知到达k个目的节点的最短路径。
下面看下书上的LS算法的伪代码。
d(v):从源节点到达目标v的最短路径的距离。
N':节点的子集;v在N'中如果从源节点到v的最短路径已知。
c(u,v):网络中给出的u, v节点之间的距离。
//LS Algorithm for Source Node u Initialization: N' = {u} for all nodes v if v is a neighbor of u then d(v) = c(u, v); else d(v) = MAX; Loop find w not in N' such that d(w) is a minimum add w to N' update d(v) for each neighbor v of w and not in N': d(v) = min( d(v), d(w) + c(w, v) ) until N' = N
因为我用来实现LS路由算法,所以用next数组记录了下一跳路由信息。pc数组表示网络连接情况,MAX代表不连通。运行之后d数组的值就更新成了源节点s到各目标节点的最短距离了。
#define MAX 30000 int pc[5][5] = {0, 2, 1, MAX, MAX, 2, 0, 2, 3, MAX, 1, 2, 0, 3, 1, MAX, 3, 3, 0, 1, MAX, MAX, 1, 1, 0}; void routerLS(int s){ //s为开始点 int flag[5]; //N' int d[5]; //距离 int next[5]; //下一跳 for(int i = 0; i < 5; i++){ //初始化 d[i] = pc[s][i]; flag[i] = 0; next[i] = i; } flag[s] = 1; int k = s, min; for(int i = 0; i < 5; i++){ min = MAX; for(int j = 0; j < 5; j++){ //找出最小值d[k] if(d[j] < min && flag[j] == 0){ min = d[j]; k = j; } } if(k == s) //k值没有改变说明没有邻居 return ; flag[k] = 1; for(int j = 0; j < 5; j++){ //更新邻边 if(d[j] > d[k] + pc[k][j] && flag[j] == 0){ d[j] = d[k] + pc[k][j]; next[j] = next[k]; } } } }