Kruskal模板

int Map[Max][Max];  
int father[Max];///存放根节点  
int n,m;  
struct node  
{  
    int a,b,c;  
}p[50005];  
int cmp(node p1,node p2)///边的排序按照权值从小到大排列  
{  
    return p1.c<p2.c;  
}  
int Find(int i)///寻找点i的根节点 
{  
    return i==father[i]?i:father[i]=Find(father[i]);  
}  
void Merge(int a,int b)///连接两个点  
{  
    int fa=Find(a);  
    int fb=Find(b);  
    if(fa!=fb)  ///判断是否连通
        father[fb]=fa;  ///不连通则将两点连通
}  
void Kruskal()  
{  
    int k=1;  
    for(int i=1;i<=n;i++)  
        for(int j=1;j<=i;j++)  
        if(Map[i][j]!=INF&&Map[i][j]!=0)
        {  ///初始化,将边进行整理
            p[k].a=i;  
            p[k].b=j;  
            p[k].c=Map[i][j];  
            k++;  
        }  
    sort(p,p+k,cmp);///将边按照升序排序  
    for(int i=1;i<=n;i++)  
        father[i]=i;  ///初始化根节点
    int j=1;  ///记录当前访问的第几条边
    k=0;  ///记录加入树中的边数
    int sum=0;///记录整棵树的权值  
    while(j<m&&k<n)///k<n是因为N个点,连通各点一次仅需要n-1条边  
    {  
        int fa=Find(p[j].a);  
        int fb=Find(p[j].b);  
        if(fa!=fb)  ///不连通,即没有回路,加入树中
        {  
            sum+=p[j].c;  ///权值增加
            k++;  ///边数增加
            Merge(p[j].a,p[j].b); ///将其连为一个整体
        }  
        j++;  ///检测下一条边
    }  
    cout<<sum<<endl;  
} 
例题: https://blog.csdn.net/a17865569022/article/details/79854778
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值