【问题标题】:Kruskal’s Minimum Spanning Tree Algorithm (C++)Kruskal 的最小生成树算法 (C++)
【发布时间】: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


    【解决方案1】:

    一个简单的解决方案是遍历节点

    connections[arc->start->name]
    

    看看他们是否匹配

    arc->finish->name
    

    如果是这样,arc->start->name 和 arc->finish->name 是相连的,合并这两个集合是没有意义的。

    【讨论】:

    • 谢谢。虽然,我试过这个,但没有奏效。代码需要修改,以便它可以确定添加弧/顶点是否在树中形成循环。我创建了一个递归方法来执行此操作并将完成的产品上传到my GitHub page
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多