浅谈——最小生成树kruskal

#include<cstdio>
#include<algorithm>
using namespace std;

int fa[200005];//fa[i]:存储i的祖先的数组 
int n,m;

struct abc {//定义一个结构体 
    int from,to,w;//from:保存这条边的左端点
                  //to:保存这条边的右端点
} q[200005];//一条用以存不同边的数组 

int getfa(int x) {//寻找x的祖先 
    if(fa[x] == x)return fa[x];//如果x的祖先是x本身,就返回x 
    else return fa[x] = getfa(fa[x]);//如果不是,就找x的祖先的祖先 
}

bool cmp(abc x,abc y) {//abc就是结构体的数据类型,相当于int之类的 
    return x.w < y.w;//帮助sort使它从大到小排列 
}

int kruskal() {
    int ans = 0;//记录标记过的边的总数,开始时这个总数是零
    for(int i = 1; i <= n; i++) {
        fa[i] = i;//初始化这个祖先数组 
    }
    sort(q+1,q+m+1,cmp);//将所有边按照边权从小到大进行排序,因为cmp就是按照边权排的序 
    for(int i = 1; i <= m; i++) {
        int l = getfa(q[i].from);//找q[i]这条边的左端点的祖先 
        int r = getfa(q[i].to);//找q[i]这条边的右端点的祖先
        if(l != r) {//两个祖先不是一个祖先 
            fa[l] = r;//实行归并操作 
            ans += q[i].w;//加上这个边的边权 
        }
    }
    return ans;//返回最小的总边权 
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++) {
        scanf("%d%d%d",&q[i].from,&q[i].to,&q[i].w);//进行输入操作 
    }
    printf("%d",kruskal());//输出最小的总边权 
    return 0;
}

我知道你们都很强...应该不用我讲吧...
那就直接看代码吧!我的代码很详细的!

posted @ 2018-12-04 20:09  容老衲补一刀  阅读(152)  评论(0)    收藏  举报