• 浅谈——最小生成树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;
    }

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

  • 相关阅读:
    2、Mybatis中一些常用的概念
    1、Mybatis的基本CRUD
    4、spring 官方下载地址
    3、Spring注解用法的一般步骤
    2、Spring开发的jar文件
    1、Spring的xml完整版命名空间
    1、Struts2和Hibernate的简单整合(带Session的管理方式)
    2、Struts2引入多个配置文件
    利用filter和动态代理解决全站乱码问题
    1、Struts2 的简单配置
  • 原文地址:https://www.cnblogs.com/rabbit-byt/p/10066492.html
Copyright © 2020-2023  润新知