迪杰斯特拉(Dijkstra)算法--有向网络最短路径

单源最短路径问题是:对于给定的有向网络G=(V,E)及单个源点v,求v到G的其余各顶点的最短路径。

算法的基本思想

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

算法代码

#include
#define max 1000                        //1000定义为最大值正无穷,表示两点之间不直接相通,或与自己相连接。
#define n 100                           //n表示一个范围,需要大于图的顶点数目,以便定义一个数组储存。n的具体值根据情况而定。
main()
{
	void DIJ(float C[n][n],int v);
	int i,j,k,e,r;
	float z;
	float a[n][n];                       //定义一个足够大的数组,用于储存图的数据。
	for(i=0;iD[k]+C[k][j]))//调整各蓝点的间距值
				{
					D[j]=D[k]+C[k][j];         //修改蓝点j+1到红点集的距离
					P[j]=k+1;                  //改变j+1的前驱为k+1
				}
	}										//所有顶点都扩充到S中
	for(i=0;i

以下图有向网络为例
迪杰斯特拉(Dijkstra)算法--有向网络最短路径_第1张图片
其邻接矩阵为
迪杰斯特拉(Dijkstra)算法--有向网络最短路径_第2张图片
先举个例子,求1到其它各点的最短路径。
具体分析步骤如下图
迪杰斯特拉(Dijkstra)算法--有向网络最短路径_第3张图片
最后一行就是求得的结果。
1->1=0。
1->2=10:看最后一行,到达2的前驱是1。则输出1->2。
1->3=50:到达3的前驱是4,到达4的前驱是1。则输出1->4->3。
1->4=30:到达4的前驱是1。则输出1->4。
1->5=60:到达5的前驱是3,到达3的前驱是4,到达4的前驱是1。则依次输出1->4->3->5。
程序输出结果如下
迪杰斯特拉(Dijkstra)算法--有向网络最短路径_第4张图片
按照上图输入即可输出上述结果。
以上是有向网络求最短路径,下面给出无向网络求最短路径的连接,感兴趣的可以看一下。迪杰斯特拉(Dijkstra)算法–无向网络最短路径

你可能感兴趣的:(常用算法)