用迪杰斯特拉算法生成路由表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define INFINITY 100 //赋值最大值
void main()
{
int tu[11][11], i, j,v0, v, w, min, r=22, a, b,temp=0, s1=5;
int final[11],s[6][11], p[11][11], q[11], d[11]; //final[11]是用来记录节点v是否在S集中,s[6][11]用来记录路由到各个网络节点
//最短路径上的正序路径;d[11]是各到开始路由的最短路径上的权值
char
str[22]={'R','1','R','2','R','3','R','4','R','5','R','6','N','1','N','2','N','3','N','4','N','5' };
int str1[66]={0,3,8,0,6,5,
1,4,4,1,6,7,
2,6,3,2,7,2,
3,0,8,3,8,2,
4,1,4,4,8,5,
4,9,2,5,8,9,
5,10,5,6,0,0,
6,1,0,6,2,0,
7,2,0,8,3,0,
8,4,0,8,5,0,
9,4,0,10,5,0};
//把记录最短路径上各节点的正序顺序值初始化
for(i=0;i<6;i++)
for(j=0;j<11;j++)
s[i][j]=100;
//初步把所有两点之间都初始化为最大值
for(i=0; i<11; i++)
for(j=0; j<11; j++)
{
if(j==i)
tu[i][j]=0;
else
tu[i][j]=INFINITY;
}
//按照题目给出的数据重新初始化列表
for(i=0; i<22; i++)
{
a=str1[3*i]; //列表中的行数
b=str1[3*i+1]; //列表中的列数
tu[a][b]=str1[3*i+2]; //列表中对应的数值
}
//打印出网络和路由间对应的列表关系
printf("\n R1 R2 R3 R4 R5 R6 N1 N2 N3 N4 N5\n"); printf(" ----------------------------------------------------------------------------\n");
for(i=0;i<11;i++)
{
printf("%c",str[2*i]);
printf("%c",str[2*i+1]);
for(j=0;j<11;j++)
printf(" %3d ",tu[i][j]);
printf("\n");
}
printf("--------------------------------------------------------------------------------\n"); /*用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v] */
/*若p[v][w]为,则w是从v0到v当前求得最短路径上的顶点 */
/*final[v]为,当且仅当v∈S,即已经求得从v0到v的最短路径 */
printf("请输入开始路由(R<=5) v0=R"); //提示输入
scanf ("%d", &v0); //输入起点对应的数值
printf("\n");
v0=v0-1; //因为C语言中数组的计数是从开始的,所以这里v0实际值为输入值减去
//打印表头
printf ("开始路由器\t目的网络\t最短路径经过的路由器或网络序列\t最短路径值\n");
printf("\n"); //回车换行
for(v=0; v<11; ++v)
{
final[v]=0;
d[v]=tu[v0][v]; // v0到v的带权长度
for(w=0; w<11; ++w)
p[v][w]=0; //设空路径
if(d[v] { p[v][v0]=1; //表示v和v0相邻 p[v][v]=1; } }//for d[v0]=0; final[v0]=1; //初始化,v0顶点属于S集 for(i=0;i<11;i++) //初始化,各个节点的前驱节点都默认为v0 q[i]=v0; while (s1--) //因为有六个路由节点,所以开始六次循环 { //开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集 for(i=1; i<11; ++i) { //其余个顶点 min=INFINITY; //当前所知离v0顶点的最近距离 for(w=0; w<11; ++w) if(!final[w]) //w顶点在V-S中 if(d[w] { v=w; min=d[w]; //w顶点离v0顶点更近 } final[v]=1; //离v0顶点最近的v加入S集 for(w=0; w<11; ++w) //更新当前最短路径及距离 if(!final[w]) if(min+tu[v][w] { //修改d[w]和q[w],w∈V-S d[w]=min+tu[v][w]; q[w]=v; //v是v0到w最短路径上的前驱节点 p[w][v]=1; //v是w到v0上最短路径的顶点 p[w][w]=1; }//if