我在计算每个不相交的集合成员中的元素数量时遇到了一些麻烦。例如,如果有人进入:
注意:第一个数字=源顶点,第二个数字=目的地顶点,第三个数字=长度
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;
}
}
我只是不确定在何时/何时增加和维护我的计数器。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
如果要计算连接每个不相交集的边数,请将每个根的当前大小存储在类似于parents
的数组中。
当边缘到来时,找到两个节点的根。如果它们相等,则增加根的计数器(我假设没有重复边缘)。如果它们不是,那么联合根,并且对于结果根的计数器值,将根的计数器值的总和加上一。