Jerry's Blog

Back

定义#

最小生成树是指在一张无向图中,选取一些边,使其满足以下条件:

  1. 选择的边能够使图中的每一个节点直接或间接相连
  2. 在满足条件 1 的前提下,使得所有边的和尽可能小.(即获得连通所有点的最小代价)

[!node]- 题目:P3366 最小生成树

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式#

第一行包含两个整数 N,MN,M,表示该图共有 NN 个结点和 MM 条无向边.

接下来 MM 行每行包含三个整数 Xi,Yi,ZiX_i,Y_i,Z_i,表示有一条长度为 ZiZ_i 的无向边连接结点 Xi,YiX_i,Y_i

输出格式#

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和.如果该图不连通则输出 orz

数据范围#

对于 100%100\% 的数据:1N50001\le N\le 50001M2×1051\le M\le 2\times 10^51Zi1041\le Z_i \le 10^4

kruskal 算法#

kruskal 算法的本质是贪心,主要分为以下几步

  1. 先将所有边按权值从小到大排序.
  2. 依次选择权值最小的边,如果这条边连接的两个端点不在同一个连通块(即不形成环),就将这条边加入生成树.
  3. 重复上述过程,直到选出 n-1 条边(n 为节点数),或者所有边都被处理完.
  4. 如果仍旧有点没有被连通,那么原图就不是连通图

判断两个边是否连通,常使用并查集.

时间复杂度:O(m)O(m)

标程——kruskal#

prim 算法#

Prim 算法也是一种贪心.

核心思想:

  • 从任意一个点出发,每次选择一条连接已选点集和未选点集、权值最小的边,将新点加入生成树.
  • 重复 n-1 次,直到所有点都被包含.

常用优先队列(堆)优化,时间复杂度 O(mlogn)O(m\log n)

适合稠密图,代码实现类似 Dijkstra,但 Prim 关注的是“连通所有点的最小代价”,不是最短路.

标程——prim#

最小生成树
https://blog.jerrylab.top/blog/graph/mst
Author Jerry
Published at 2026年3月2日