2021-03-13

实验报告

课程名称 《算法分析与设计》 实验日期 2021 年 3 月 8 日 至 2021 年 3 月 14日
学生姓名 石晨昊 所在班级 计算机194 学号 2019212212322
实验名称 Kruskal算法
实验地点 同组人员

1.问题
采用Kruskal算法构造最小生成树的过程
2.解析
假设共有n个节点,m条边,每次从未选择过的边集E中选取权值最小的一条边,若该最小边的端点不与已选边的端点构成回路,则将该边加入到最小生成树中,重复这一步骤直到选够n-1条边或无边可选。
3.设计

void kruskal(int n, vector<edge> Edge)
{
    father.resize(n);
    sort(Edge.begin(), Edge.end(), compare);
    for (int i = 0; i < n; ++i)
    {
        father[i] = i;
    }
    for (int i = 0; i < Edge.size() && result.size() < n-1; ++i)
    {
        int u = Edge[i].u;
        int v = Edge[i].v;
        if (findfather(u) != findfather(v)) //判断父节点是否相同
        {
            result.push_back(Edge[i].weight);
            father[findfather(u)] = father[findfather(v)]; //将两点并入一个集合中
        }
    }
    if (result.size() != n - 1)
    {
        cout <<  result.size()  << "该图不连通" << endl;
        return;
    }
    else
    {
        cout << "最小生成树的各边如下:" << endl;
        for (int i = 0; i < result.size(); ++i)
        {
            cout << result[i] << endl;
        }
    }
}

4.分析
时间复杂度n^2
5.源码
[github源码地址]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值