zoukankan      html  css  js  c++  java
  • 最小生成树问题:kruskal算法

    struct edge(int u,v,cost;};


    bool comp(const edge& e1,const edge& e2)
    {
        return e1.cost<e2.cost;
    }


    edge es[MAX_E];
    int V,E;


    //下面是自定义好的并查集的实现
    int par[MAX_N];//父亲
    int rank[MAX_N];//树的高度
    void init(int n)
    {
        for(int i=0;i<n;i++)
        {
            par[i]=i;
            rank[i]=0;
        }
    }




    int find(int x)//查询树的根
    {
        if(par[x]==x)
        {
            return x;
        }
        else 
        {
            return par[x]=find(par[x]);//递归查找
        }
    }




    void unite(int x,int y)//合并x和y所在的集合
    {
        x=find(x);
        y=find(y);
        if(x==y)return;
        if(rank[x]<rank[y])
        {
            par[x]=y;//如果x的高度小于y的高度,则x插到y的下层(减少树的退化)
        }
        else 
        {
            par[y]=x;//否则,y插入到x的下层
            if(rank[x]==rank[y])rank[x]++;
        }
    }




    bool same(int x,int y)
    {
        return find(x)==find(y);
    }




    //最小生成树的算法:

    int kruskal()
    {
        sort(es,es+E,comp);//按照边的权值从小到大排序,接下来就可以用贪心思想
        init(V);
        int res=0;
        for(int i=0;i<E;i++)
        {
            edge e=es[i];
            if(!same(e.u,e.v))
            {
                unite(e.u,e.v);//如果该边的两端不连通就合并它们
                res+=e.cost;
            }
        }
        return res;
    }
  • 相关阅读:
    REST接口设计规范总结
    Linux 下建立 Git 与 GitHub 的连接
    Linux centos修改防火墙为iptables
    一些开源软件的国内镜像源
    centOS7下安装GUI图形界面
    mysql使用锁的分析
    php后台添加默认图片
    php执行时间
    递归获取所有分类下面子分类的id
    php laravel左连接leftJoin多条where语句
  • 原文地址:https://www.cnblogs.com/linruier/p/9485195.html
Copyright © 2011-2022 走看看