迪雷杰斯特拉算法,会统计所有路由器吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪雷杰斯特拉算法,会统计所有路由器吗相关的知识,希望对你有一定的参考价值。
迪雷杰斯特拉算法,会统计所有的路由器,首先先来说一下迪杰斯特拉算法,从大概念上来说,该方法属于一种贪心算法,即当加进一个点后,算其相邻所有点的最短路径路由算法有很多,本篇采用迪杰斯特拉最短路径法实现简单的路由算法。可能很多人一看到这个就会想到数据结构了,想到数据结构中必须要建立图的结构就很头疼,今天这种写法可以先不采用数据结构书上的写法,也可以实现相同的功能,毕竟,咱们的重点是要学习使用迪杰斯特拉算法,而不是构建图结构。
首先先来说一下迪杰斯特拉算法,从大概念上来说,该方法属于一种贪心算法,即当加进一个点后,算其相邻所有点的最短路径。详细过程如下:
如下图,要计算其中 点1 到其余各点的最短路径
总的计算过程见下表
表中红颜色代表当前行未加入到点集中的最小值,蓝颜色代表和上一个新加入点集中的点相邻的点,可能这样说还不是很清楚,就看下面的具体过程了。
第一步:初始化,把和 点1 相连的所有点的D(i)初始化,从图中可以看出,1和2、4、5相连,所以D(2)=10,D(4)=30,D(5)=100,点1和点3不直接相连,所以D(3)=65535,代表无穷大(在java里,可以用Integer.MAX_VALUE来表示无穷大)。由于现在点集中只有点1,所以找出刚才步骤1那行中D(i)最小的点,为点2(图中红色标明),将其加入到点集中。
第二步:此时点集中新加入了点2,则以点2为出发点,从图中看到只有点3与其相连,所以这一步中只需要更新D(3)即可,D(3)= minD(3), D(2)+ d(2,3),即D(3)= min65535, 10+ 50 = 60,更新D(3)=60,其余点不变。这行更新完毕,发现未加入到点集中的D(4)最小,所以将点4加入到点集中。
第三步: 此时点集中新加入了点4,则以点4为出发点,从图中看到点3和点5与其相连,所以这一步需要更新D(3)和D(5)的值,D(3)= minD(3), D(4)+ d(4,3) ,即D(3) = min60, 30+20 = 50;D(5) = minD(5), D(4)+ d(4,5) = min 100, 30 + 60 = 90。此时这一行其他数据不用变,此行更新完毕,找出未加入到点集中的 点3、点5 中的最小值,应该是点3,加入到点集中。
第四步,此时点集中新加入了点3,则以点3为出发点,发现点5与其相连,只需要更新D(5)即可。D(5) = minD(5), D(3)+ d(3,5) = min 90, 50 + 10 = 60,此时这行更新完毕,只有最后一个 点5 未加入到点集中了,所以将其加入。
第五步,此时点集中新加入了点5,则以点5为出发点,发现根本没有点与其相连,甚好,此行就不用再更新了。
第六步,机智的我发现所有点都被包含在了点集中,所以本次迪杰斯特拉算法就到此结束了。剩下的就是代码实现了。
用一个二维数组d[i][j]来存从第i个点到第j个点的路径权重,其中65535为无穷大; 用一个一维数组f[i]才表示从第1个节点到第i个节点的最短路径。 参考技术A 不会。这种情况是不会统计所有的路由器的。
迪杰斯特拉算法-简单容易理解
1.最短路径算法
画一张图:简单
首先是连通图,单向连通图
1-4找到最短路径 first-last
遍历所有节点
1-所有节点判断,如果有的话前继节点就是1 2,5
这个时候我们就需要判断这几个节点2,5
但是我们还得遍历,因为我们不知道 这个时候找2的前继节点是
1吗?可能有其他路径在2没关系局部最优,因为如果有其他节点到2的话说明这个节点可以到2
如果距离更小,那么就选择这个节点为前继节点,但是必须是已经连接的节点,
复杂也就是这个原理
public int[,] matirx()
int[,] a = new int[5,5];
//int[][] a = a;
//Console.WriteLine(a);
for(int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
a[i,j] = 10000;
a[0,0] = 6;
a[0,1] = 5;
a[0, 4] = 1;
a[4, 3] = 1;
a[3, 1] = 1;
a[1,2] = 7;
return a;
public void dijiesitela()
int dis;
int[,] a = matirx();
//dis = a[0,2];
int[] value = new int[5];
int[] arr = new int[5];
bool[] flag1 = new bool[5];
//b[0]=
int first = 0;
int last = 2;
int count = 0;
int flag = 10000;
for(int xu = 0; xu < 5; xu++)
for(int xu1 = 0; xu1 < 5; xu1++)
Console.Write(a[xu, xu1] + " ");
Console.WriteLine();
for (int i = 0; i < 5; i++)
value[i] = 10000;
flag1[i] = false;
value[first] = 0;
for (int i = 0; i < 5; i++)
for (int ii = 0; ii < 5; ii++)
if (!flag1[ii] && value[ii] < 10000)
first = ii;
//Console.WriteLine(first);
flag1[first] = true;
//里面 判断first节点的后继节点
//first要改变
for (int j = 0; j < 5; j++)
if (j != first && value[first] + a[first,j] < value[j])
arr[j] = first;
value[j] = value[first] + a[first,j];
int[] last1 = new int[5];
last1[0] = 0;
last1[last] = 2;
/*for (int intint = 0; intint < arr.Length; intint++)
Console.WriteLine(arr[intint]);*/
int count1 = 1;
while (arr[last] != 0)
Console.WriteLine(arr[last]);
last = arr[last];
last1[count1]= arr[last];
//sleep(1000);
while (true)
Console.Write("");
以上是关于迪雷杰斯特拉算法,会统计所有路由器吗的主要内容,如果未能解决你的问题,请参考以下文章