核心思想概述
图论算法的设计通常围绕着以下几种核心思想:
-
遍历:系统地访问图中的所有顶点,这是绝大多数图算法的基础。主要分为:
- BFS
- DFS
-
贪心算法:在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的。许多最小生成树和最短路径算法都基于此思想。
-
动态规划:将复杂问题分解为更小的子问题,并存储子问题的解以避免重复计算。用于解决所有节点对之间的最短路径等问题。
-
松弛操作:这是最短路径算法(如Dijkstra和Bellman-Ford)的核心操作。它通过不断更新和优化当前已知的从源点到某个顶点的最短距离估计值,最终得到真实的最短距离。
遍历算法
- BFS
- DFS
最短路径
Dijkstra算法
思想:贪心算法 。通过从源点开始逐层向外扩展,每次选择距离源点最近且未访问过的节点,并通过该节点更新其他节点的距离,直到所有节点都被访问或达到目标点。
缺点:不能处理负值。
Bellman-Ford算法
思想:动态规划。解决单源最短路径问题,并能检测负权环。
对图中所有边进行|V| - 1 轮松弛操作。
每一轮松弛都尝试更新所有顶点的距离估计值。
经过|V| - 1 轮后,理论上应得到所有可能的最短路径。
Floyed算法
思想:动态规划 。解决所有顶点对之间的最短路径问题。
使用一个三维DP数组(通常优化为二维):dp[i][j]dp[i][j]dp[i][j] 表示从顶点i到顶点j的最短路径长度。
状态转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])
通俗理解:对于每一对顶点(i,j)(i, j)(i,j),尝试看看是否通过新引入的顶点kkk可以缩短距离。
特点:代码极其简洁,可以处理负权边,但不能处理负权环(因为负权环本身无最短路径概念)。
最小生成树
在一个带权无向连通图中,找到一棵边权值之和最小的生成树。
Prim算法(归并点)
思想:贪心算法。从某个顶点开始,逐步"生长"一棵树。
Kruskal算法(归并边)
思想:贪心算法 。按权重从小到大考虑所有边,如果不构成环,就加入生成树。
不构成环使用并查集进行判断。
参考
- deepseek生成