Алгоритм минимального связующего дерева Крускала (C ++)

Я работаю хоть назначение на курсе Stanford CS106B C ++, но я очень застрял в реализации алгоритма Крускала, чтобы найти минимальное связующее дерево.

Чтобы быть более конкретным, я не могу понять логику, чтобы определить, добавлять ли дугу / вершину к дереву. Вот инструкции, которые мне дали:

«Стратегия, которую вы будете использовать, основана на отслеживании подключенных наборов. Для каждого узла сохраняйте набор подключенных к нему узлов.
начало, каждый узел связан только с самим собой. Когда новая дуга
добавлено, что вы объединяете наборы двух конечных точек в один большой объединенный набор, к которому теперь подключены оба узла. При рассмотрении
дуга, если его две конечные точки уже принадлежат одному и тому же связанному набору,
нет смысла добавлять эту дугу, и поэтому вы ее пропускаете. «

void getMinSpanTree(graphT *&graph)
{
Map<Set <nodeT *> > connections;

// Create set of arcs in decreasing order
Set<arcT *> arcs(costCmp);
Set<arcT *>::Iterator gItr = graph->arcs.iterator();
while (gItr.hasNext()) {
arcT *arc = gItr.next();
arcs.add(arc);
}

// Initialise map with initial node connections
Set<nodeT *>::Iterator nItr = graph->nodes.iterator();
while (nItr.hasNext()) {
nodeT *node = nItr.next();
Set<nodeT *> nodes;
nodes.add(node);
connections.add(node->name, nodes);
}

// Iterate through arcs
Set<arcT *>::Iterator aItr = arcs.iterator();
while (aItr.hasNext()) {
arcT *arc = aItr.next();

if (connections[arc->start->name].equals(connections[arc->finish->name])) {
Set<nodeT *> nodes = connections[arc->start->name];
nodes.unionWith(connections[arc->finish->name]);
connections[arc->start->name] = nodes;
connections[arc->finish->name] = nodes;

// Update display with arc
coordT start = {arc->start->x, arc->start->y};
coordT finish = {arc->finish->x, arc->finish->y};
DrawLineBetween(start, finish, HIGHLIGHT_COLOR);
}
}
}

Я знаю строку:

if (connections[arc->start->name].equals(connections[arc->finish->name])) {

должен быть изменен. Кто-нибудь знает, что это должно быть? 🙂

2

Решение

Одним простым решением было бы перебирать узлы в

connections[arc->start->name]

и посмотреть, совпадают ли они

arc->finish->name

Если это так, arc-> start-> name и arc-> finish-> name соединены, и нет смысла объединять два набора.

2

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

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

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