什么是图的最小生成树
一个有 N N N 个点的图,边一定是大于等于 N − 1 N-1 N−1 条的。图的最小生成树,就是在这些边中选择 N − 1 N-1 N−1 出来,连接所有的 N N N 个点。这 N − 1 N-1 N−1 条边的边权之和是所有方案中最小的。
如图,该最小生成树的权值为 8 + 18 + 18 + 15 + 9 + 3 = 71 8+18+18+15+9+3=71 8+18+18+15+9+3=71。
常用算法
Prim 算法
Prim 算法采用与 Djikstra、Bellman-Ford 算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点。
以 1 为起点生成最小生成树,min[v]
表示蓝点 v 与白点相连的最小边权, M S T \mathrm{MST} MST 表示最小生成树的边权之和。
-
初始化:
min[v]
= ∞ =\infty =∞ ,min[1]
= 0 =0 =0, M S T = 0 \mathrm{MST} =0 MST=0。 -
for(int i=1;i<=n;i++)
-
寻找
min[u]
最小的蓝点 u。 -
将 u 标记为白点。
-
$\mathrm{MST} $ +=
min[u]
。 -
for
循环寻找与白点 u 相连的所有蓝点 v,并将min[v]
更新。
if(w[u][v]<min[v])
min[v]=w[u][v];
- 求得 M S T \mathrm{MST} MST 即为最小生成树的权值之和。
算法图解
dis | |
---|---|
a | 0 0 |