!!!最重要---最短路径优先算法在路由选择中的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最短路径算法在路由选择中的应用全部资料如下:

1.核心算法(最短路径Dijkstra算法)

#include

#define MaxVertexNum 100

/* 最大顶点数设为100 */

#define MaxCost 9999

/* 边的权值最大为9999 */

typedef char VertexType;

/* 顶点类型设为字符型*/

typedef int EdgeType;

/* 边的权值设为整型*/

typedef struct

{ VertexType vexs[MaxVertexNum];

/* 存放顶点信息*/

EdgeType edges[MaxVertexNum][MaxVertexNum];

/* 存放邻接关系*/

int n,e; /*顶点数和边数*/

}Mgraph;

void CreateMGraph(Mgraph *G)

{int i,j,k,w;

printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n") ;

scanf("%d,%d",&(G->n),&(G->e));

printf("请输入顶点信息:\n");

for(i=0;in;i++)

scanf("\n%c",&(G->vexs[i]));

for(i=0;in;i++)

for(j=0;jn;j++)

G->edges[i][j]=MaxCost;

printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j,w):\n");

for(k=0;ke;k++)

{ scanf("%d,%d,%d",&i,&j,&w);

G->edges[i][j]=w; }

}

void ShortestPath(Mgraph *G,int P[ ],int D[ ])

{ int final[MaxVertexNum],i,j,k,min;

final[0]=1; /* 初始时集合S中只有0号顶点*/

D[0]=0;

P[0]=-1; /* 0号顶点无前驱顶点,用-1表示*/

for(i=1;in;i++)

{ final[i]=0;

D[i]=G->edges[0][i];

P[i]=0; /* P[i]存放i号顶点的前驱顶点*/

}

for(i=1;in; i++) /*重复G->n-1次*/

{ min=MaxCost;

for(k=0;kn;k++)

if(final[k]==0&&D[k]

{j=k;min=D[k];}

final[j]=1; /* 将顶点j加入集合S */

for(k=0;kn;k++)

if(final[k]==0 && D[j]+G->edges[j][k]< D[k])

{ D[k]=D[j]+G->edges[j][k];

P[k]=j; }

}

}

void main()

{Mgraph G;

int P[MaxVertexNum],D[MaxVertexNum];

int i,pre;

CreateMGraph(&G);

ShortestPath(&G,P,D);

printf("\n\n\n从源点到各点最短路径权值及路径如下:\n"); for(i=1;i

{ printf("%d: %d",D[i],i);

pre= P[i];

while(pre>=0)

{ printf("<-%d",pre);

pre=P[pre];

}

printf("\n");

}

}

2.运行结果截图:

3.以下是文字叙述:

最短路径算法在路由选择中的运行过程是:在某一包含若干路由器的网络区域中,以其中某一路由器A为例。

路由器A以自己为原点,将从其他本地区域广播来的已更新的链路状态信息收集起来。在知道本地自治系统区域内部的拓扑图和链路状态信息情况下,构造自己的链路状态数据库。然后每个路由器在本地根据这个数据库中的信息,利用Dijkstra最短路径优先算法构造一个以其自己为根到该自治系统区域内部各个网络的最短路径树。如果路由器想发送数据到某网络,则根据构造好的最短路径树来选择最短路径,继而发送数据到目的地。

可以这样说最短路径算法在路由选择中的应用,具体到网络协议上就是开放最短路径优先协议OSPF。

OSPF是一种链路状态路由选择协议。对于大规模的自治系统的管理,它引入了区域(area)的概念,即把许多网络和主机组合在一起,再加上连接在这些网络上的路由器,这些合起来称为一个区域。一个自治系统可分为多个区域,每个区域包含一组网络和路由器。一个区域内的路由器相互之间交换所有的信息,而对于同一个自治系统内的其他区域内的路由器这隐藏它的详细拓扑结构。这种分级结构可以减少路由信息的流量,并且简化路由的计算。

在每个自治系统内,有一个特殊的区域,称为主干区域(backbone area).OSPF规定,所有区域间的通信必须经过此主

干区域。整个自治系统就是一个以主干区域为中心的逻辑星形拓扑结构,这要求主干区域必须是连续的,即其中的任两台路由器都可以通信。

如图1所示,路由器按其所处的位置分为4类:

①. 内部路由器:该路由器所连接的网络都属于同一区域,且运行同一种链路状态路由选择协议。

②. 区域边界路由器(Area Border Router,ABR): 该路由器连接在多个区域中,它运行多种链路状态路由协议,每个区域一个。ABR把它连接的区域浓缩后的拓扑信息传递给主干区域,再由主干区域分发给其他区域。

③. 主干路由器(Backbone Router,BR):指连在主干区域的路由器,它除了包括所有的区域边界路由器外,还可能包括别的路由器。

④. 自治系统边界路由器(Autonomous System Border Router,ASBR): 与其他自治系统中的路由交换路由信息。ASBR 可能是内部区域边界路由器,并且可能属于主干区域,也可能不属于主干区域。

图一.

相关文档
最新文档