验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

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

阅读:287 来源:乙速云 作者:代码code

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

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

      知识补充

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

      思路:就是最小生成树啊

      代码

      #include
      #include
      #include
      #include
      #include
      using namespace std;
      #define INTMAX 0x3f3f3f3f
      typedef pair pii;
      typedef long long ll;
      #define x first
      #define y second
      
      int 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 arr_edge;
      
      void debug()
      {
          for(int i=0;i            
                          
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>