iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现基于不相交集合的kruskal算法
  • 905
分享到

C++怎么实现基于不相交集合的kruskal算法

2023-07-05 05:07:19 905人浏览 安东尼
摘要

这篇文章主要介绍“c++怎么实现基于不相交集合的kruskal算法”,在日常操作中,相信很多人在C++怎么实现基于不相交集合的kruskal算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现基于

这篇文章主要介绍“c++怎么实现基于不相交集合的kruskal算法”,在日常操作中,相信很多人在C++怎么实现基于不相交集合的kruskal算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现基于不相交集合的kruskal算法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    C++实现基于不相交集合的O(mlgn)复杂度的kruskal算法

    不相交集合的数据结构

    我们采用森林的方式实现不相交集合。这个森林是极简化的,每个节点只有一个指向父亲的指针,而且森林中的每一颗树都是一个集合,我们取树的根节点为这个集合的代表元。

    int rank[505];int father[505];void make_set(int x){father[x]=x;rank[x]=0;}int find_set(int x){    if (x!=father[x])    {        father[x]=find_set(father[x]);    }    return father[x];}void simply_uNIOn_set(int u,int v){    u=find_set(u);    v=find_set(v);    father[u]=v;}void  perfect_union_set(int u,int v){    u=find_set(u);    v=find_set(v);    if (rank[u]>rank[v])    {        father[v]=u;    }    else    {        father[u]=v;        if(rank[u]==rank[v])        rank[v]++;    }}

    可以看到在find_set()函数中采用了两趟遍历的思想,第一趟遍历找的根节点,第二趟遍历将路径上的节点全部指向根节点,完成了压缩树高。

    在实现集合合并的时候,我们采用了两种方法:一种方法是直接合并simply_union_set,另一种是采用按秩合并的思想perfect_union_set,即总是让秩小合并到秩大的集合中,这是一种减少树高的有效策略;

    当我们采用按秩合并时时,上述每一个操作的最差时间复杂度,都约等于O(1)

    kruskal 算法

    void kruskal(){    for(int i=0;i<num_v;i++)make_set(i);    sort(arr_edge.begin(),arr_edge.end(),mycompare);    for(int i=0;i<arr_edge.size();i++)    {        int fr=arr_edge[i].fr;        int to=arr_edge[i].to;        int w=arr_edge[i].w;        if( find_set(fr)!=find_set(to))        {        result+=w;            perfect_union_set(fr,to);        }    }}

    kruskal 算法是一种基于贪心策略的算法,它的时间复杂度的最大开销就是排序算法,即O(mlgm)=O(mlgn),这里m表示边数,n表示顶点数

    知识补充

    乘胜追击一下,通过一个例题再深入了解一下kruskal 算法吧

    思路:就是最小生成树啊

    代码

    #include<iOStream>#include<alGorithm>#include<cstring>#include<cstdio>#include<vector>using namespace std;#define INTMAX 0x3f3f3f3ftypedef pair<int,int> pii;typedef long long ll;#define x first#define y secondint rank[505];int father[505];int find_set(int x){    if (x!=father[x])    {        father[x]=find_set(father[x]);    }    return father[x];}void simply_union_set(int u,int v){    u=find_set(u);    v=find_set(v);    father[u]=v;}void  perfect_union_set(int u,int v){    u=find_set(u);    v=find_set(v);    if (rank[u]>rank[v])    {        father[v]=u;    }    else    {        father[u]=v;        if(rank[u]==rank[v])        rank[v]++;    }}struct edge{    int fr,to,w;};int num_case,num_v,result;vector<edge> arr_edge;void debug(){    for(int i=0;i<arr_edge.size();i++)    {        cout<<arr_edge[i].fr<<" to "<<arr_edge[i].to<<"="<<arr_edge[i].w<<endl;    }}void init(){    arr_edge.clear();    result=0;}void input(){    int w;    scanf("%d",&num_v);    for(int i=0;i<num_v;i++)    {        for(int j=0;j<num_v;j++)        {            scanf("%d",&w);            if(i<j)            {                edge temp;                temp.fr=i;                temp.to=j;                temp.w=w;                arr_edge.push_back(temp);            }        }    }}bool mycompare(const edge& x,const edge &y){    return x.w<y.w;}void kruskal(){    for(int i=0;i<num_v;i++)father[i]=i;    sort(arr_edge.begin(),arr_edge.end(),mycompare);    for(int i=0;i<arr_edge.size();i++)    {        int fr=arr_edge[i].fr;        int to=arr_edge[i].to;        int w=arr_edge[i].w;        if( find_set(fr)!=find_set(to))        {            result=max(result,w);            simply_union_set(fr,to);        }    }}void solve(){    init();    input();    //debug();    kruskal();    cout<<result<<endl;}int main(){    scanf("%d",&num_case);    while(num_case--)    {        solve();    }    return 0;}

    到此,关于“C++怎么实现基于不相交集合的kruskal算法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: C++怎么实现基于不相交集合的kruskal算法

    本文链接: https://www.lsjlt.com/news/349725.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++怎么实现基于不相交集合的kruskal算法
      这篇文章主要介绍“C++怎么实现基于不相交集合的kruskal算法”,在日常操作中,相信很多人在C++怎么实现基于不相交集合的kruskal算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现基于...
      99+
      2023-07-05
    • C++实现基于不相交集合的O(mlgn)复杂度的kruskal算法
      目录C++实现基于不相交集合的O(mlgn)复杂度的kruskal算法不相交集合的数据结构kruskal 算法知识补充C++实现基于不相交集合的O(mlgn)复杂度的kruskal算...
      99+
      2023-02-22
      C++实现kruskal算法 C++ kruskal算法 C++ kruskal
    • C#中怎么实现多个集合的交集查找
      在C#中,可以使用LINQ来实现多个集合的交集查找。首先,将多个集合合并到一个集合中,然后使用LINQ的Intersect方法来查找...
      99+
      2024-04-02
    • 基于C++怎么实现柏林噪声算法
      本篇内容主要讲解“基于C++怎么实现柏林噪声算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于C++怎么实现柏林噪声算法”吧!概述引述维基百科的介绍:Perlin噪声(Perlin nois...
      99+
      2023-07-05
    • C#算法中怎么实现各位相加
      本文小编为大家详细介绍“C#算法中怎么实现各位相加”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#算法中怎么实现各位相加”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。各位相加给定一个非负整数 num...
      99+
      2023-06-26
    • C++基于栈的深搜算法实现马踏棋盘
      马踏棋盘(基于栈的深搜算法实现) 简单来说,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径,这就是马踏棋盘的简单描述。 话不多说,代码如下,要是有什么不懂的地...
      99+
      2024-04-02
    • 基于Matlab怎么实现鲸鱼优化算法
      这篇文章主要介绍“基于Matlab怎么实现鲸鱼优化算法”,在日常操作中,相信很多人在基于Matlab怎么实现鲸鱼优化算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Matlab怎么实现鲸鱼优化算法”的疑...
      99+
      2023-06-30
    • 基于Matlab怎么实现野狗优化算法
      本篇内容介绍了“基于Matlab怎么实现野狗优化算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.概述野狗优化算法(Dingo Opti...
      99+
      2023-06-30
    • C++ 基于BFS算法的走迷宫自动寻路的实现
      目录1.效果图2.实现代码1.队列方法类2.地图方法类3.main函数3.思路1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改...
      99+
      2024-04-02
    • c语言排列组合算法怎么实现
      C语言排列组合算法可以通过递归实现。下面是一个示例代码: #include <stdio.h> void combin...
      99+
      2024-02-29
      c语言
    • 基于python win32setpixel api怎么实现计算机图形学相关操作
      本篇内容介绍了“基于python win32setpixel api怎么实现计算机图形学相关操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
      99+
      2023-06-21
    • C++回溯算法中组合的相关问题怎么解决
      这篇文章主要讲解了“C++回溯算法中组合的相关问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++回溯算法中组合的相关问题怎么解决”吧!回溯算法模板void backtracki...
      99+
      2023-07-05
    • 基于Redis无序集合实现禁止多端登录功能的方法
      这篇文章给大家分享的是有关基于Redis无序集合实现禁止多端登录功能的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言一个集合类型可以存储最多2^32 -1 个字符串集合类...
      99+
      2024-04-02
    • Python基于决策树算法的分类预测怎么实现
      今天小编给大家分享一下Python基于决策树算法的分类预测怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、决策树的...
      99+
      2023-06-26
    • OpenCV基于分水岭算法的图像分割怎么实现
      本文小编为大家详细介绍“OpenCV基于分水岭算法的图像分割怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“OpenCV基于分水岭算法的图像分割怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. ...
      99+
      2023-07-05
    • 如何使用C++基于栈的深搜算法实现马踏棋盘
      这篇文章主要介绍如何使用C++基于栈的深搜算法实现马踏棋盘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!马踏棋盘(基于栈的深搜算法实现)简单来说,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径...
      99+
      2023-06-29
    • 基于C++的摄像头图像采集及拼接程序该怎么实现
      今天给大家介绍一下基于C++的摄像头图像采集及拼接程序该怎么实现。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。程序的说明实现从摄像头实时采集单帧图像,之后完成...
      99+
      2023-06-28
    • Python基于域相关实现图像增强的方法是什么
      这篇文章主要讲解了“Python基于域相关实现图像增强的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于域相关实现图像增强的方法是什么”吧!介绍当在图像上训练深度神经...
      99+
      2023-06-26
    • Python基于DFA算法怎么实现内容敏感词过滤
      这篇文章主要讲解了“Python基于DFA算法怎么实现内容敏感词过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于DFA算法怎么实现内容敏感词过滤”吧!DFA 算法是通过提前...
      99+
      2023-06-30
    • 怎么用RMI实现基于Java的分布式计算
      这篇文章将为大家详细讲解有关怎么用RMI实现基于Java的分布式计算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 2 Enterprise Edition(J2EE)远程方法调用(Remote ...
      99+
      2023-06-03
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作