Подсчет количества членов в непересекающемся множестве

У меня возникли небольшие проблемы с подсчетом количества элементов в каждом из моих непересекающихся членов набора. Например, если кто-то входит в:

Примечание: первое число = исходная вершина, 2-е число = конечная вершина, 3-е число = длина

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

Решение

Если вы хотите посчитать количество ребер, соединяющих каждый непересекающийся набор, сохраните текущий размер каждого корня в массиве, похожем на parents,

Когда появляется ребро, найдите корни обоих узлов. Если они равны, увеличьте счетчик для корня (я предполагаю, что нет повторяющихся ребер). Если это не так, объедините корни, и для полученного значения счетчика корня положите сумму значений счетчика корней плюс один.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]