算法分析与设计实践-作业1-2-Kruakal构造最小生成树

Kruskal算法构造最小生成树

1.问题

给定一张边带权的无向图G = (V,E) , n =|V| , m = |E| 。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最小生成树。

2.解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.设计

void kruskal(){
    sort(edge,edge+m,cmp);//将边的权值排序
    for(i from 0 to m-1){
    	eu=find(edge[i].u);
        ev=find(edge[i].v);
        if(eu==ev){ //若出现两个点已经联通了,则说明这一条边不需要了
            continue;
        }
        ans+=edge[i].w;//将此边权计入答案
        fa[ev]=eu;//将eu、ev合并
        if(++cnt==n-1){ //循环结束条件,即边数为点数减一时
            break;
        }
    }
}

4.分析

时间复杂度分析:设n个顶点,m条边。

  1. 对集合中的每一个顶点,都将它的集合初始化为自身:O(n)
  2. 将边按权值进行排序:O(mlogm)
  3. 对排序好后的边从小到大进行判断,如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合放进同一集合中,如此循环加到生成树中的边集数量为n-1时停止。

虽然不确定第三步骤的时间复杂度,但可以肯定的是第三步骤的时间复杂度一定小于O(mlogm),所以综上所诉,Kruskal算法的时间复杂度为O(mlogm)。

5.源码

https://github.com/lu-225/As-before/blob/master/2018212212124%20%E9%99%86%E5%AE%B6%E8%BE%89%20%E5%AE%9E%E9%AA%8C1-2/Kruskal.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值