您的位置:首页 > 其它

最短路径算法(Dijkstra和Floyd)

2013-05-18 14:45 369 查看
最短路径:

最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。

Dijkstra(迪杰斯特拉)算法的基本思想:

每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。

代码如下:

int Pathmatrix[MAXVEX];//用于存储最短路径下标的数组(前驱顶点的下标)
int ShortPathTable[MAXVEX];//用于存储到各点最短路径的权值和

void ShortestPath(MGraph G,int Vo,int Pathmatrix[],int ShortPathTable[])
{
	int v,w,k,min;
	int final[MAXVEX];//若final[w]为1,表示求得顶点Vo到Vw的最短路径
	for (v = 0; v < G.vertexNum; v++)//初始化数据
	{
		final[v] = 0;
		Pathmatrix[v] = 0;
		ShortPathTable[v] = G.matrix[Vo][v];//将与Vo点有连线的顶点加上权值
	}
	ShortPathTable[Vo] = 0;//Vo至Vo的路径为0
	final[Vo] = 1;
	for (v = 1; v < G.vertexNum; v++)//每次循环求得Vo到某个顶点v的最短路径
	{
		min = INFINITE;//初始化min
		for (w = 0; w < G.vertexNum; w++)//寻找离Vo最近的顶点
		{
			if (!final[w] && ShortPathTable[w] < min)
			{
				k = w;
				min = ShortPathTable[w];//w顶点离Vo更近
			}
		}
		final[k] = 1;//将目前找到的最近的顶点置为1
		for (w = 0; w < G.vertexNum; w++)//更新当前最短路径及距离
		{
			//如果经过v顶点的路径比现在这条路径的长度短的话
			if (!final[w] && (min + G.matrix[k][w]) < ShortPathTable[w])
			{
				ShortPathTable[w] = min + G.matrix[k][w];
				Pathmatrix[w] = k;
			}
		}
	}
}


Floyd(弗洛伊德)算法的基本思想:

从任意节点 A 到任意节点 B 的最短路径不外乎 2 种可能,1 是直接从 A 到 B,2 是从 A 经过若干个节点 X 到 B。所以,我们假设 ShortPathTable(AB) 为节点 A 到节点 B 的最短路径的距离,对于每一个节点 X ,我们检查ShortPathTable(AX) + ShortPathTable(XB) < ShortPathTable(AB) 是否成立,如果成立,证明从 A 到 X 再到 B 的路径比 A 直接到 B 的路径短,我们便设置 ShortPathTable(AB)
= ShortPathTable(AX) + ShortPathTable(XB),这样一来,当我们遍历完所有节点 X,ShortPathTable(AB) 中记录的便是 A 到 B 的最短路径的距离。

代码如下:

int Pathmatrix[MAXVEX][MAXVEX];//用于存储最短路径下标的数组
int ShortPathTable[MAXVEX][MAXVEX];//用于存储到各点最短路径的权值和

void ShortestPath(MGraph G,int Pathmatrix[][MAXVEX],int ShortPathTable[][MAXVEX])
{
	int v,w,k;
	for (v = 0; v < G.vertexNum; v++)//初始化数据
	{
		for (w = 0; w < G.vertexNum; w++)//如果经过下标为k顶点路径比原来两点间路径更短
		{
			ShortPathTable[v][w] = G.matrix[v][w];
			Pathmatrix[v][w] = w;
		}
	}
	for (k = 0; k < G.vertexNum; k++)
	{
		for (v = 0; v < G.vertexNum; v++)
		{
			for (w = 0; w < G.vertexNum; w++)
			{
				if (ShortPathTable[v][w] > ShortPathTable[v][k] + ShortPathTable[k][w])
				{
					ShortPathTable[v][w] = ShortPathTable[v][k] + ShortPathTable[k][w];
					Pathmatrix[v][w] = Pathmatrix[v][k];//路径设置经过下标为k的顶点
				}
			}
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐