Dijkstra算法最短路径----按路径长度递增的次序产生最短路径

一、最短路径

最短路径问题(Shortest Path)是指从在带权图的某一顶点(称为源点)出发,找到一条通往另一顶点(称为终点)的最短路径。

二、Dijkstra算法

- 基本思想
(1)把图中的所有顶点分为两组,一组为已确定最短路径的顶点;一组为尚未确定最短路径的顶点。
(2)按路径长度递增的顺序逐个把第二组的长度加到第一组中去,直到源点出发到达的所有顶点中全部包含至第一组。

  • 具体做法
    (1)最开始第一组顶点只包含顶点v0,第二组包含其他所有顶点。
    (2)确定初始值,v0对应的距离为0,第二组中各顶点若存在边或者(v0,vi),则vi的距离为这条边的权值,若不存在则为无穷大。
    (3)每次从第二组的顶点中选一个权值最小的顶点vu加入到第一组中,并及时对第二组中的距离值做修正。
    (4)循环进行,直到没有顶点可加入到第一组中。
  • 设计思路
    (1)引入一维数组S[i]来记录顶点vi是否已求得最短路径,S[i]==false表示未求得最短路径,S[i]==true表示已求得最短路径。
    (2)引入一维数组dist[j]记录当前求出的源点v0到顶点vj的最短路径距离。
    (3)引入一维数组Path[i]记录从源点v0到各点vi的最短路径上vi的直接前驱结点下标;若v0到vi无路径,则Path[i]==0.

Dijkstra最短路径///
template<class T, class W>
void ShortestPath(Graph<T, W>& G, int v, W dist[], int path[])
{
	//Graph是一个带权有向图,建立一个数组dist[j](0<=j
	int n = G.NumberOfVertices();
	bool *S = new bool[n];   //最短路径顶点集
	int i, j, k, u;
	W w, min;
	for (i = 0; i < n; i++)       //数组初始化
	{
		dist[i] = G.getWeight(v, i);
		S[i] = false;
		if (i != v && dist[i] < MaxWeight)
			path[i] = v;
		else
		{
			path[i] = -1;
		}
	}
	S[v] = true;
	dist[v] = 0;   //顶点v加入顶点集合
	for (i = 0; i < n - 1; i++)   //选不在S中的最短路径顶点u
	{
		min = MaxWeight;
		u = v;
		for (j = 0; j < n; j++)
		{
			if (S[j] == false && dist[j] < min)
			{
				u = j;
				min = dist[j];
			}
		}
		S[u] = true;  //将顶点u加入集合S
		for (k = 0; k < n; k++)   //修改
		{
			w = G.getWeight(u, k);
			if (S[k] == false && w < MaxWeight && dist[u] + w < dist[k])
			{   //顶点k未加入S,且绕过u可缩短路径
				dist[k] = dist[u] + w;
				path[k] = u;   //修改到k的最短路径
			}

		}
	}

你可能感兴趣的:(数据结构)