Kruskal Algorithm 克鲁斯卡尔算法

Kruskal

首先 我们约定 n为节点数,m为边数

一、概念

Kruskal算法主要用于解决Minimum Spanning Trees(最小生成树)问题。

二、基本思想

先选择权值较小的边,检查是否存在回路,然后继续选择,直到选择了 n − 1 n-1 n1 的边结束。

三、模板代码

const int N=1005;//Nodes Count
const int M=2010;//Edges Count
int p[N];//p[i]记录节点 i 的父节点
int n;//顶点数
int res=0;
struct Edge
{
    int a;//Start Point of the edge
    int b;//End Point of the edge
    int v;//The Value of the edge
}edge[M];
int find(int x)//找到x的父节点
{
    return p[x]==x ? x : p[x]=find(p[x]);
    //等价于以下代码
    /*
    if(p[x]==x)//如果其父节点是其本身(它就是最nb的节点)
    	return x;
    else 
        p[x]=find(p[x]);//令x的父节点p[x]去寻找其父节点并赋值(路径压缩)       
    return find(p[x]); 
    */
}
void merge(int x,int y)//将含x,y的两个集合合并成一个集合
{
    p[find(x)]=find(y);
}
bool cmp(Edge x,Edge y)//排序函数
{
    return x.v<y.v;    
}
int main()
{
    for (int i = 0; i < N; i++) p[i]=i;//初始每个节点的父节点都为自己
    //Input every edges info
    /* Code */
    sort(edge,edge+idx,cmp);//idx:边数
    int cnt=0;//记录已选择边的数量
    for (int i = 0; i < idx; i++)//枚举选择每条边
    {
        int x=edge[i].a,y=edge[i].b;
        if(find(x)!=find(y)) //没有成环
        {
            cnt++;
            merge(x,y);
            res+=edge[i].v;
            if(cnt==n-1) break;//如果题意可能不存在最小生成树,请依题意修改
        }
    }
    cout << res << endl;
}

四、实例题目

【习题】【最小生成树习题】LaoQiao C/C++ Group B 2020.4 9.通电
仅部分习题,若想了解更多习题请关注微信公众号或者博客。


如有疑问欢迎在评论区留言或者通过Email联系我

My Email:Wizzy-Ang@qq.com

欢迎大家关注我的个人公众号WizzyAngShare,(还有个人博客)

我会在这里分享编程语言语法,算法,及区块链的相关知识,还有各种奇奇怪怪的小知识等着你~

QRCode
虽然现在这个公众号有亿点草率 ,我会努力更新的~~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值