最小生成树

最小生成树

定义

对于一张带权无向连通图,其生成树中权值总和最小的称为最小生成树。

类似地,最大生成树就是权值总和最大的生成树。

克鲁斯卡尔(kruskal)算法

kruskal算法是求最小生成树的经典算法,其时间效率和空间效率都很优秀且易于理解。

求最小生成树还有许多其他的算法,比如 Prim 以及 Boruvka。

kruskal 运用贪心思想,结合并查集,巧妙地解决了最小生成树问题。

其流程大概是这样的:

  1. 对图中所有的边按照边权由小到大排序。

  2. 遍历每一条边,对于边的端点 \(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;
        }
	}
}
posted @ 2023-01-22 20:17  蒟蒻炖蒟蒻  阅读(54)  评论(0)    收藏  举报