37 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| title: Shortest Path on a Graph
 | ||
| localeTitle: 图上的最短路径
 | ||
| ---
 | ||
| ## 图上的最短路径
 | ||
| 
 | ||
| 在图上找到两点之间的最短路径是数据结构中的常见问题,尤其是在处理优化时。图是由边连接的一系列节点。图形可以被加权(边缘携带值)和方向(边缘具有方向)。
 | ||
| 
 | ||
| 这方面的一些应用是飞行路径优化或[凯文培根6度](https://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon)
 | ||
| 
 | ||
| ## Dijkstra的算法
 | ||
| 
 | ||
| 这个问题最常见的解决方案是Dijkstra算法,它更新当前节点与其所有邻居之间的最短路径。在更新所有邻居的距离之后,它移动到具有最低距离的节点并且对所有未观察的邻居重复该过程。此过程一直持续到访问整个图形为止。
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| **第0步:**
 | ||
| 
 | ||
| 我们需要设置图表,以便记录所需的值。在任何边缘,我们都有它连接的两个节点之间的距离。在任何节点上,我们与起始节点的距离最短。让我们将每个节点上的值设置为正无穷大,并将起始节点上的值设置为零。
 | ||
| 
 | ||
| **步骤1:**
 | ||
| 
 | ||
| 查看直接与起始节点相邻的所有节点。连接起始节点和这些相邻节点的边缘所携带的值是到每个相应节点的最短距离。在节点上记录这些距离 - 覆盖无穷大 - 并且还跨越节点,这意味着已找到它们的最短路径。
 | ||
| 
 | ||
| **第2步:**
 | ||
| 
 | ||
| 选择其中一个已经计算出最短路径的节点,我们称之为我们的枢轴。查看与其相邻的节点(我们将这些称为目标节点)以及将它们分开的距离。对于每个目标节点:如果pivot中的值加上连接它的边值总计小于目标节点的值,则更新其值,因为找到了新的较短路径。如果已探索到此目标节点的所有路由,则可以将其划掉。
 | ||
| 
 | ||
| **第3步:**
 | ||
| 
 | ||
| 重复步骤2,直到所有节点都被划掉。我们现在有一个图表,其中任何节点中保存的值将是从起始节点到它的最短距离。
 | ||
| 
 | ||
| #### 更多信息:
 | ||
| 
 | ||
| [更多关于Dijkstra的算法](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)
 | ||
| 
 | ||
| [其他最短路径算法](https://en.wikipedia.org/wiki/Shortest_path_problem#Algorithms) |