算法

来源:互联网 发布:知乎双刀周杰伦 编辑:程序博客网 时间:2024/04/29 02:49

Floyd算法和Dijkstar算法是用来获得图中两点最短路径的算法。Dijkstar算法最终能够得到一个节点到其他所有节点的最短路径,而Floyd算法最终能够找出每对点之间的最短距离。

Dijkstar算法

算法简介

  Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权回路。

算法描述  (这里描述的是从节点1开始到各点的dijkstra算法,其中Wa->b表示a->b的边的权值,d(i)即为最短路径值)

  1. 置集合S={2,3,...n}, 数组d(1)=0, d(i)=W1->i(1,i之间存在边) or +无穷大(1.i之间不存在边)

  2. 在S中,令d(j)=min{d(i),i属于S},令S=S-{j},若S为空集则算法结束,否则转3

  3. 对全部i属于S,如果存在边j->i,那么置d(i)=min{d(i), d(j)+Wj->i},转2

复杂度分析

  Dijkstra 算法的时间复杂度为O(n^2) 

  空间复杂度取决于存储方式,邻接矩阵为O(n^2)

 

问题描述:给定图G,求其顶点t到其他所有点的最短路径。

算法描述:将图所有点的集合S分为两部分,V和S-V。V集合是已经得到最短路径的点的集合,在初始情况下V中只有一个顶点t,S-V是还未得到最短路径点的集合。然后,在每一次迭代过程中取得S-V集中到V集合任一点距离最短的点,将其加到V集合,从V-S集合删除。重复此过程直到S-V集合为空。

时间复杂度:O(|E|+|V|\log|V|)

示例:


 

伪代码:

算法实现

输入输出格式 

       输入格式:

  第1行:一个数n,代表有n个节点

  第2-n+1行:每行n个数,代表图的邻接矩阵,没有边相连为-1

  输出格式:

  第1行:n-1个数,分别是1号节点到2-n号节点的最短路径

Java代码:

 

 Floyd算法

问题描述:给定图G,得到每个点对的最短距离。

算法描述:Floyd算法是一个动态规划算法,最初矩阵A0是图的邻接矩阵,AK矩阵表示从i到j的最短路径,这些路径不能能通过大于K的节点,最终的矩阵AN就是想要得到的矩阵了。那么AK矩阵与A(K+1)矩阵有什么关系呢?关系就是A(K+1)[i,j]=min(A(K)[i,j],A(K)[i,k]+A(K)[k,j]),也就是看加上K点后,是不是能找到更短的距离。

时间复杂度:O(|V|^3) 顶点数的三次方。

示例:一上面的图为例子,下面展示了矩阵系列的建立过程:

Perl代码

0 0
原创粉丝点击