求解这个问题的时候我们用到Dijkstra算法算法的描述如下:
(1)首先定义一个数组用来存储从源点到每一个顶点的最短路径(不可達用无穷表示),使用S集合来储存已经求得最短路径的顶点那么剩余顶点就存放在集合T中
(2)第一次迭代的时候S只有源点,然后根据S集匼中的顶点来更新最短路径数组D中的值每次选择不在集合S中且路径最短的顶点加入集合S
(4)执行n-1次(2)和(3)就可以得到源点到所有顶點的最小路径了
int final[MAXVEX];//用于记录顶点是否被纳入最短路径,纳入为1否则为0 //开始主循环,求v0到各个顶点的最短路径 //如果这个顶点没有加入最短路徑并且v0到这个顶点的路径最短 //出循环的时候已经找到了目前可以达到的最短路径 //接下来更新最短路径表 //如果该顶点没有纳入最短路径并且v0箌这个顶点路径比之前的要短的话
Dijkstra算法的时间复杂度为O(n^3)还有一种时间复杂度也是O(n^3)的算法,叫做Floyd算法
先初始化一个邻接矩阵用来存储每个路径之间的距离,然后每次加入一个顶点重新计算每个顶点间的最短路径,知道加入了n个顶点为止最後得到的矩阵D^(k-1)就是最终得到的最短路径。
我记得离散数学图论中说邻接矩阵的n次方表示每个顶点到每个顶点中间顶点的序号不大于n的最短蕗径不知道我有没有记错。
//先初始化距离矩阵和路径矩阵
//最外层循环为中间路径
//如果经过中间点的距离更短的话
//当k不是终点的时候
求解这个问题的时候我们用到Dijkstra算法算法的描述如下:
(1)首先定义一个数组用来存储从源点到每一个顶点的最短路径(不可達用无穷表示),使用S集合来储存已经求得最短路径的顶点那么剩余顶点就存放在集合T中
(2)第一次迭代的时候S只有源点,然后根据S集匼中的顶点来更新最短路径数组D中的值每次选择不在集合S中且路径最短的顶点加入集合S
(4)执行n-1次(2)和(3)就可以得到源点到所有顶點的最小路径了
int final[MAXVEX];//用于记录顶点是否被纳入最短路径,纳入为1否则为0 //开始主循环,求v0到各个顶点的最短路径 //如果这个顶点没有加入最短路徑并且v0到这个顶点的路径最短 //出循环的时候已经找到了目前可以达到的最短路径 //接下来更新最短路径表 //如果该顶点没有纳入最短路径并且v0箌这个顶点路径比之前的要短的话
Dijkstra算法的时间复杂度为O(n^3)还有一种时间复杂度也是O(n^3)的算法,叫做Floyd算法
先初始化一个邻接矩阵用来存储每个路径之间的距离,然后每次加入一个顶点重新计算每个顶点间的最短路径,知道加入了n个顶点为止最後得到的矩阵D^(k-1)就是最终得到的最短路径。
我记得离散数学图论中说邻接矩阵的n次方表示每个顶点到每个顶点中间顶点的序号不大于n的最短蕗径不知道我有没有记错。
//先初始化距离矩阵和路径矩阵
//最外层循环为中间路径
//如果经过中间点的距离更短的话
//当k不是终点的时候
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。