最小生成树主要代码

初始化

void UFset( )  //初始化
{
     for(int i=1;i<=n;i++){

         parent[i]=i;
    // printf("777777%d\n",parent[i]);
     }
 }

建边



for(int i=2;i<=n;i++){
    edge[++cnt].from=road[i-1].id;
    //printf("%lld\n",edge[cnt].from);
    edge[cnt].to=road[i].id;
    edge[cnt].cost=road[i].x-road[i-1].x;


查找是否加入集合

int find(int x)
{
    if(parent[x]==x) { //代表x无上级了,即队长
          //  printf("eeee%d\n",x);
        return x;}
    return parent[x]=find(parent[x]);
}

主函数

struct side{  
    int s,t, len;  
}s[55555];  
int pre[1100];//并查集用的前驱数组  
int n,m;  
bool cmp(side a,side b)  
{  
    return a.len<b.len;  
}  
int find(int x)  
{  
    if(pre[x]==x)  //代表x无上级了,即队长
        return x;  
    return pre[x]=find(pre[x]);  
}  
int main()  
{  
    while(~scanf("%d%d",&n,&m))  
    {  
        For(int i=0;i<=n;i++)pre[i]=i;
        for(int i=0;i<m;i++)  
        {  
            int s1,t,w;  
            scanf("%d%d%d",&s1,&t,&w);  
            s[i].s=s1;  
            s[i].t=t;  
            s[i].len=w;  
        }  
        sort(s,s+m,cmp);  //排序,然后从小边开始选
        int sum=0;  
        int count=0;  
        for(int i=0;i<m && count<n-1;i++)  
        {  
            //记下两端点的队长   
            int fx=find(s[i].s);  
            int fy=find(s[i].t);  
            if(fx!=fy)//不在一个集合  
            {  
                pre[fx]=fy;  
                sum+=s[i].len;  
                count++;  
            }  
        }  
        printf("%d\n",sum);  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值