Kruskal算法-并查集

描述

给定无向图跟(V,E),连接G种所有点,且边集是E的子集的权值最小的树。

题解

边排序之后,第i小的边的序号保存在r[i]中(间接排序,排序的关键字是对象的“代号”,而不是对象本身)。
在这里插入图片描述
r[]初始化为{1,2,3,4,5,6},经过排序后变成{2,4,5,3,1,6}。r[0]=2,代表最小的边为原始数据的第二条边。

代码

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn1 105
#define maxn2 105
struct node{
    int u,v,w;
}G[maxn1];
int n,m,r[maxn2],p[maxn1];
int find_(int x){
    return p[x]==x?x:p[x]=find_(p[x]);
}
int cmp(const int i,const int j){
    return G[i].w<G[j].w;
}
int main()
{
    while(scanf("%d%d",&n,&m)==1){
        int ans=0;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w);
            r[i]=i;
        }
        for(int i=0;i<n;i++){
            p[i]=i;
        }
        sort(r,r+m,cmp);
        for(int i=0;i<m;i++){
            int e=r[i];
            int x=find_(G[e].u);
            int y=find_(G[e].v);
            if(x!=y){
                ans+=G[e].w;
                y=p[x];
            }
        }
        printf("%d",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_27690765/article/details/88764401