У меня возникли небольшие проблемы с подсчетом количества элементов в каждом из моих непересекающихся членов набора. Например, если кто-то входит в:
Примечание: первое число = исходная вершина, 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;
}
}
Я просто не уверен, где / когда увеличивать и поддерживать мой счетчик. Любая помощь будет оценена. Спасибо!
Если вы хотите посчитать количество ребер, соединяющих каждый непересекающийся набор, сохраните текущий размер каждого корня в массиве, похожем на parents
,
Когда появляется ребро, найдите корни обоих узлов. Если они равны, увеличьте счетчик для корня (я предполагаю, что нет повторяющихся ребер). Если это не так, объедините корни, и для полученного значения счетчика корня положите сумму значений счетчика корней плюс один.
Других решений пока нет …