图的最短路径——算法学习(1.1待完善)

最短路算法:

  1. floyd算法
  2. Dijkstra算法
  3. Dijkstra算法(堆优化)
  4. ford算法
  5. spfa算法(ford算法的队列优化)

一、只有5行代码的floyd算法:

1、 什么是floyd算法

弗洛伊德算法是解决多元最短路径的算法(什么是多源, 顾名思义就是起点有多个, 跑完floyd算法就算出以每个顶点做起点到各个点的最短路径)。

2、时间复杂度 O(n^3), 空间复杂度O(n^2)

3、适用性:

			1、多源最短路
			2、带负权值的
			优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
			缺点:时间复杂度比较高,不适合计算大量数据。

4、代码实现

for(k = 0;k < n;k++)
	for(i = 0;i< n;i++)
		for(j = 0;j <n;j++)
			if(grap[i][j] > grap[i][k]+grap[k][j])
				 grap[i][j] = grap[i][k]+grap[k][j];

floyd算法用到的是动态规划算法。
动规公式: grap[i][j] = min(gtap[i][j], grap[i][k]+grap[k][j]).

二、单源最短路径的Dijkstra算法(未用堆排优化):

1、什么是Dijkstra

2、时间复杂度O(n^2)

3、适用性:

		1、单源最短路径
		2、不带负权值的边

4、代码实现:

for(i = 1;i < n;i++{
	min = inf;
	for(j = 1;j <= n;j++)
	{
		if(book[j] == 0&& dis[j] < min)//寻找离源点最近且未被标记的顶点
		{
			min = dis[j];
			u = j;//储存该顶点
		}
	}
	book[u] = 1;//标记该点
	for(j = 1;j <= n;j++{
		if(e[u][v] < inf)//查找该点相连接的点(查看改点有哪些出边)
		{
			if(dis[v]> dis[u]+e[u][v])//判断源点是否能通过点u 与点v缩短距离(松弛操作)
			{
				dis[v] = dis[u]+e[u][v];
			}
		}
	}
	
}

三、单源负权的ford算法:

猜你喜欢

转载自blog.csdn.net/qq_43824791/article/details/88779354