最小生成树
最小生成树
定义
对于一张带权无向连通图,其生成树中权值总和最小的称为最小生成树。
类似地,最大生成树就是权值总和最大的生成树。
克鲁斯卡尔(kruskal)算法
kruskal算法是求最小生成树的经典算法,其时间效率和空间效率都很优秀且易于理解。
求最小生成树还有许多其他的算法,比如 Prim 以及 Boruvka。
kruskal 运用贪心思想,结合并查集,巧妙地解决了最小生成树问题。
其流程大概是这样的:
-
对图中所有的边按照边权由小到大排序。
-
遍历每一条边,对于边的端点 \(u\),\(v\),有两种情况:
a. \(u\),\(v\) 已经在生成树中,此时如果再连接 \(u\),\(v\) 将会形成环,不满足生成树性质,所以直接跳过。
b. 反之,将 \(u\),\(v\) 加入生成树中并统计答案。
对于如何查询两点是否已经在生成树中以及将两点加入到生成树中,可以利用并查集解决。
核心代码
void kruskal()
{
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(fnd(a[i].u)!=fnd(a[i].v))
{
pre[fnd(a[i].u)]=fnd(a[i].v);
ans+=a[i].w;
}
}
}

浙公网安备 33010602011771号