LS链路状态路由算法

时间:2022-07-13 11:13:41

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