Kruskal的最小生成树算法

Kruskal’s Minimum Spanning Tree Algorithm (C++)

本文关键字:算法 最小生成树 Kruskal      更新时间:2023-10-16

我正在完成斯坦福CS106B c++课程的作业,但是我在实现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])) { 

需要修改。有人知道应该是什么吗?:)

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

中的节点
connections[arc->start->name]

并查看它们是否匹配

arc->finish->name

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