最短路径算法

1.最短路径问题介绍: 
从图中的某个顶点出发到达另外一个顶点所经过边的权重和最小的一条路径,称为最短路径

最短路径算法一般有一下三种:

迪杰斯特拉算法(Dijkstra算法)

弗洛伊德算法(Floyd算法)

SPFA算法

这篇博客对Dijkstra算法来做一个详细的介绍。

2.Dijkstra算法介绍
算法特点:

迪杰斯特拉算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

算法的思路

Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。 
然后,从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,此时完成一个顶点, 然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。 
然后,又从dis中找出最小值,注意此时找到的最小值是在还没有找到最短路径的集合中去找,重复上述动作,直到T中包含了图的所有顶点。

3.Dijkstra算法演示

最短路径算法_第1张图片

上图是5个顶点带权图,图中已经表明各顶点之间的权重,在演示迪杰斯特拉算法时,从v0开始,计算过程如下所示

最短路径算法_第2张图片

第一次计算选择v0开始,将与v0有连接的权重的值赋值在dis中,如上图所示dis[0]=0  dis[1]=3  dis[4]=30,并将v0加入已算出最短路径点的集合中{v0}。
第二次计算在dis中选择最小的值开始,最小值是dis[1]=3(dis[0]=0,虽然是最小,但是v0已经计算出最短路径,不参与比较),然后将v1加入已经计算点的集合中{v0,v1},并更新与v1相连接的顶点最短路径:此时v0到v3经过v0-->v1-->v3,路径长度为11,比dis[3]=∞小,更新dis[3]=11,同理更新dis[2]=28

第三次计算在dis中的最小值是dis[3]=11,  将v3加入集合{v0,v1,v3}中,v0-->v2经过路径v0-->v1-->v3-->v2权重为15,比dis[2]=28小,更新dis[2]=15,同理更新dis[4]=23,

重复以上工作,也就是第四次,第五次计算,这时已经计算的点的集合为{v0,v1,v3,v2,v4},计算结束,这已经计算出了最短路径,但是还不知最短路径,你可以在计算过程中记录每个节点的前驱,这样就可以得出源点到每个顶点的路径


4.Dijkstra算法代码(JAVA版本)
 

package graph;
 
public class Dijkstra {
 
	final int max=Integer.MAX_VALUE;
	int num=5;//顶点数
	int dis[];//最短路径
	int pre[];//节点前驱,用于记录节点路径
	boolean vertexs[];//记录节点是否已经加入集合
	//邻接矩阵
	int matrix[]={
	 max,3,max,max,30,
	 max,max,25,8,max,
	 max,max,max,max,10,
	 20,max,4,max,12,
	 5,max,max,max,max
	};
	public Dijkstra()
	{
		dis=new int[num];
		pre=new int[num];
		vertexs=new boolean[num];
		for(int i=0;iv"+i+":");
			if(temp==-1)
			{
				System.out.print("无路径\n");
				continue;
			}
			//pre中存储的是当前节点的前驱,要从当前节点开始,往前寻找,直到找到源点为止
			String str="--->v"+i;
			while(temp!=-1)
			{
				str="v"+temp+str;
				temp=pre[temp];
				if(temp!=-1)
				{
					str="--->"+str;
				}
			}
			System.out.println(str+":"+dis[i]);
		}		
	}
	public static void main(String[] args) {
		
		Dijkstra djst=new Dijkstra();
		djst.ShortestPath(0);
		djst.printInfo(0);
		
	}
 
}

 

你可能感兴趣的:(代码,算法)