Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求不相交集的数目_C++_Algorithm_Data Structures_Disjoint Sets_Disjoint Union - Fatal编程技术网

C++ 求不相交集的数目

C++ 求不相交集的数目,c++,algorithm,data-structures,disjoint-sets,disjoint-union,C++,Algorithm,Data Structures,Disjoint Sets,Disjoint Union,对于不熟悉不相交集数据结构的用户 我试图从给定的朋友组和他们的关系中找出朋友组的数量。当然,毫无疑问,这可以使用BFS/DFS轻松实现。但是我选择使用不相交集,我也倾向于找到这个人所属的朋友组,等等,不相交集听起来当然适合这种情况 我已经实现了不相交集数据结构,现在我需要找到它包含的不相交集的数量(这将给出组的数量) 现在,我一直致力于实现如何高效地找到不相交集的数量,因为朋友的数量可能多达100个 我认为应该有效的选项 把新的放在原来的后面,然后销毁旧的 在每个联合中更改每个元素的父元素 但

对于不熟悉不相交集数据结构的用户

我试图从给定的朋友组和他们的关系中找出朋友组的数量。当然,毫无疑问,这可以使用BFS/DFS轻松实现。但是我选择使用不相交集,我也倾向于找到这个人所属的朋友组,等等,不相交集听起来当然适合这种情况

我已经实现了不相交集数据结构,现在我需要找到它包含的不相交集的数量(这将给出组的数量)

现在,我一直致力于实现如何高效地找到不相交集的数量,因为朋友的数量可能多达100个

我认为应该有效的选项

  • 把新的放在原来的后面,然后销毁旧的

  • 在每个联合中更改每个元素的父元素

  • 但是由于朋友的数量很大,我不确定这是否是正确的方法,也许有其他有效的方法,或者我应该继续执行上面的任何一种方法

    这是我的代码,以获取更多详细信息。(我没有在这里实现计数不相交集)

    //不相交集概念
    //https://www.topcoder.com/community/data-science/data-science-tutorials/disjoint-set-data-structures/
    //最初,所有顶点都作为一个集合,它们是它们自己的代表。
    //接下来我们看,比较两个顶点,如果它们有相同的父对象(集合的代表),我们将其保留。
    //如果他们没有,我们就把他们合并成一组。
    //最后我们得到不同的不相交集。
    #包括。。。
    使用名称空间std;
    #定义边对
    const int max 1000000;
    矢量图;
    int N,M;
    int-parent[max];
    int findset(int x,int*parent){
    //找到集合代表。
    如果(x!=父[x]){
    父[x]=findset(父[x],父);
    }
    返回父项[x];
    }
    虚空不相交(){
    for(int i=0;iN>>M;//朋友数和M边数
    int u,v,w;//u=source,v=destination,w=weight(在这里没有用处)。
    重置();
    对于(inti=0;i>u>>v>>w;
    图。推回(对(w,边(u,v));
    }
    不相交();
    打印();
    返回0;
    }
    
    如果您只需要知道不相交集的数量,而不是它们是什么,那么一个选项是在数据结构中添加一个计数器变量,计算有多少不相交集。最初,有n个不相交集,每个元素一个。每次执行并集操作时,如果两个元素没有相同的representative,那么你知道你正在将两个不相交的集合合并成一个集合,这样你就可以减少计数器的数量。看起来像这样:

    if (pu != pv){ //if not in the same set.
        numDisjointSets--;  // <--- Add this line
        mst.push_back(graph[i]);
        total += graph[i].first;
        parent[pu] = parent[pv]; // create the link between these two sets
    }
    
    if(pu!=pv){//if不在同一集合中。
    
    NUMDISJ点集--;//在不相交集数据结构中,对两个项目
    a、b
    的每个联合操作都有两种可能的情况:

  • 您试图合并同一集合中的项目。在这种情况下,不执行任何操作,不相交集合的数量保持不变
  • 您将两个不同集合中的项目合并在一起,因此基本上将两个集合聚合为一个集合-有效地将不相交集合的数量减少了一个
  • 由此,我们可以得出结论,通过从上面跟踪(2)型并集的数量,可以很容易地找到每个时刻不相交集的数量。

    如果我们用
    such\u unions
    来表示这个数字,那么每个点的集合总数就是
    numberu\u of\u initial\u set-such\u unions

    这个方法和保持联合操作总数的计数有什么不同吗?比如说,count=1初始值,我们每次调用联合时都增加count。回答得好!想要upv吗太好了!!!!!!!!!!
    if (pu != pv){ //if not in the same set.
        numDisjointSets--;  // <--- Add this line
        mst.push_back(graph[i]);
        total += graph[i].first;
        parent[pu] = parent[pv]; // create the link between these two sets
    }