【发布时间】:2013-05-23 14:38:57
【问题描述】:
我在斯坦福 CS106B C++ 课程中通过 an assignment 工作,但我在执行 Kruskal 算法以找到最小生成树时遇到了很大困难。
更具体地说,我无法弄清楚确定是否将弧/顶点添加到树的逻辑。这些是我得到的指示:
“您将使用的策略基于跟踪连接集。对于每个节点,维护与其连接的节点集。在 一开始,每个节点都只连接到自己。当一个新的弧 添加后,您将两个端点的集合合并为一个更大的组合集合,两个节点现在都连接到该集合。当考虑一个 弧,如果它的两个端点已经属于同一个连通集, 添加该弧没有意义,因此您跳过它。”
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])) {
需要更改。有谁知道它应该是什么? :)
【问题讨论】:
标签: c++ minimum-spanning-tree kruskals-algorithm