计算不相交集中的成员数

时间:2012-11-13 10:39:22

标签: c++ algorithm disjoint-sets

我在计算每个不相交的集合成员中的元素数量时遇到了一些麻烦。例如,如果有人进入:

注意:第一个数字=源顶点,第二个数字=目的地顶点,第三个数字=长度

0 2 1

4 8 7

5 8 6

1 2 5

2 3 17

我会将2作为集合的计数

4 8 7

5 8 6

和3作为集合的计数,因为它们都由2和3(各个)元素连接。

0 2 1

1 2 5

2 3 17

我有把每个不相交集的元素数的计数存储到一个整数数组中的想法,所以我可以访问永远不相交集的计数。下面是我查找元素并将它们合并到同一个集合中的实现。我还有一个在每一组中找到根的功能。

int node::findSet(int v, int *parent)
{
  if(parent[v] < 0)
    return v;
  else
  {
    return parent[v] = findSet(parent[v], parent);
  }
}

void node::joinSets(int c, int p1, int p2, int *parents)
{
  join(findSet(p1,parents),findSet(p2,parents),parents);
}

void node::join(int p1, int p2, int *parents)
{
  if(parents[p2] < parents[p1])
    parents[p1] = p2;
  else
  {
    if(parents[p1] == parents[p2])
      parents[p1]--;
    parents[p2] = p1;
  }
}

我只是不确定在何时/何时增加和维护我的计数器。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

如果要计算连接每个不相交集的边数,请将每个根的当前大小存储在类似于parents的数组中。

当边缘到来时,找到两个节点的根。如果它们相等,则增加根的计数器(我假设没有重复边缘)。如果它们不是,那么联合根,并且对于结果根的计数器值,将根的计数器值的总和加上一。