Я работаю хоть назначение на курсе 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])) {
должен быть изменен. Кто-нибудь знает, что это должно быть? 🙂
Одним простым решением было бы перебирать узлы в
connections[arc->start->name]
и посмотреть, совпадают ли они
arc->finish->name
Если это так, arc-> start-> name и arc-> finish-> name соединены, и нет смысла объединять два набора.
Других решений пока нет …