zoukankan      html  css  js  c++  java
  • 并查集

      在一些应用问题中,需要将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定规律将归于同一组元素的集合合并。在此过程中要反复用到查询某个元素归属于哪个集合的运算。适合于描述这类问题的抽象数据类型称为并查集。

      并查集支持3中操作:

    (1)Union(root1,root2) 把子集合root2并入集合root1中,要求root1与root2互不相交,否则不执行合并。

    (2)Find(x)搜索单元素x所在的集合,并返回该集合的名字。

    (3)UFSets(sz) 构造一个并查集,并将所有元素的元素初始化为只有一个单元素的子集合。

    #include<iostream>
    using namespace std;

    int * UFSets(int sz)
    {
    int* parent = new int[sz];
    for(int i=0;i<sz;i++) parent[i]=-1;
    return parent;
    }
    int Find(int * parent,int x)
    {
    while(parent[x]>=0) x=parent[x];
    return x;
    }
    void Union(int * parent,int root1, int root2)
    {
    int temp;
    int r1=Find(parent,root1),r2=Find(parent,root2);
    if(r1!=r2)
    {
    temp
    =parent[r1]+parent[r2];
    if(parent[r2]<parent[r1])
    {
    parent[r1]
    =r2;
    parent[r2]
    =temp;
    }
    else
    {
    parent[r2]
    =r1;
    parent[r1]
    =temp;
    }
    }
    }
    int main()
    {
    int *parent=UFSets(10);
    Union(parent,
    1,4);
    Union(parent,
    1,9);
    Union(parent,
    4,9);
    Union(parent,
    2,6);
    Union(parent,
    2,5);
    for(int i=0;i<10;i++)
    {
    cout
    <<parent[i]<<" ";
    }
    cout
    <<endl;
    return 0;
    }

  • 相关阅读:
    LOJ#6031. 「雅礼集训 2017 Day1」字符串
    LG P4768 [NOI2018] 归程
    LG P3250 [HNOI2016]网络
    BZOJ4644 经典傻逼题
    LG P4373 [USACO18OPEN]Train Tracking P
    CF1375H Set Merging
    LG P6541 [WC2018]即时战略
    CF1097G Vladislav and a Great Legend
    python学习笔记-基本概念
    python学习笔记十-文件操作
  • 原文地址:https://www.cnblogs.com/coser/p/1985769.html
Copyright © 2011-2022 走看看