最短路径算法(Dijkstra和Floyd)

最短路径:

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


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的顶点
				}
			}
		}
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值