我在计算每个不相交的集合成员中的元素数量时遇到了一些麻烦。例如,如果有人输入:
注意:第一个数字 = 源顶点,第二个数字 = 目标顶点,第三个数字 = 长度
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;
}
}
我只是不确定在哪里/何时增加和维护我的计数器。任何帮助,将不胜感激。谢谢!