克鲁斯卡尔算法基本使用方法及相关示例

这个算法是基于并查集,然后结合了贪心思想;

我使用正确发过的一个题作为例子;

完整代码见文章:公路村村通

先用一个结构体来存储两个城镇的编号及相关费用;

然后写一个并查集模板,前面也有发的;

具体情况就是这样:

typedef struct {
    int u,v,w;
}WW;
int p[1001];
int find(int x){
    if(p[x]==x)
        return x;
    else return p[x]=find(p[x]);
}

该算法的关键在于通过并查集去将每一个顶点作为一个单独的集合,然后通过贪心思想去进行从小到大的检索,得到每个边的根,通过判断根是否相同,然后进行合并集合;

这里每合并一个就可以进行累加计算,从而得到我们所需要的最低成本;

代码:

    for(int i=0;i<e;i++){
        u=D[i].u;
        v=D[i].v;
        x=find(u);
        y=find(v);
        if(x!=y){
            p[x]=y;
            sum=sum+D[i].w;
        }
    }

//讲解的有一些草率,可能是没有学好吧,回头理解慢慢深刻了,会回来更新文章的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值