数据结构——最小(代价)生成树
要解决“连通图中选n−1n-1n−1条边连接所有顶点且总权值最小”的问题,最小(代价)生成树是核心工具。它有两种经典算法——Kruskal和Prim,下面分别从思想、过程、代码及细节展开深入讲解。
最小(代价)生成树
在连通的带权无向图中,“生成树”是包含所有顶点的极小连通子图(有nnn个顶点,n−1n-1n−1条边);“最小生成树”则是总权值(所有边的权值和)最小的生成树,是解决“网络布线、管道铺设”等最小成本问题的关键。
1. Kruskal算法:按边权选边,避环连通
Kruskal算法的核心是“按边权从小到大选边,用并查集避免环”,其设计巧妙利用了“贪心策略”——每次选当前权值最小的边,且保证不形成环,最终得到总权值最小的生成树。
(1)算法思想的深层逻辑
- 对边排序的目的:确保每次选的是“当前未用边中权值最小的”,这是贪心策略的体现;
- 并查集的作用:快速判断两条边是否属于“同一连通分量”(若属于,选这条边会形成环,需跳过)。只有连接不同连通分量的边,才能加入生成树,保证生成树的“无环”和“连通”特性。
(2)过程分析的细节补充(结合图6.16)
图6.16中,每条边的选择都伴随着“连通分量的合并”:
- 初始时,每个顶点都是独立的连通分量,共6个分量;
- 选边(V1,V3,1)(V_1,V_3,1)(V1,V3,1)后,V1V_1V1和V3V_3V3合并为一个分量,剩余5个分量;
- 选边(V4,V6,2)(V_4,V_6,2)(V4,V6,2)后,V4V_4V4和V6V_6V6合并为一个分量,剩余4个分量;
- 选边(V2,V5,3)(V_2,V_5,3)(V2,V5,3)后,V2V_2V2和V5V_5V5合并为一个分量,剩余3个分量;
- 选边