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];
}
}
}
}