Kruskal的最小生成树算法
Kruskal’s Minimum Spanning Tree Algorithm (C++)
我正在完成斯坦福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是相连的,合并这两个集合没有意义。
相关文章:
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 使用 Prim 算法计算最小生成树:如何使其简单?
- C 中的贪婪算法最小搜索
- 如何找出哪种算法最快
- 提升最小生成树,如何先做深度
- Prim 和 Boruvka 的最小生成树算法
- 哪种去卷积算法最适合从文本中去除运动模糊
- 使用最小生成树(C/C++)查找从A到B的路径
- 尝试使用书中的最小生成树示例,但它不适用于大数据
- 如何使用 Prim 算法从输入文件中查找具有给定坐标集的最小生成树?
- 如何用BFS算法表示生成树的预序
- 设计PRIM算法最有效的数据结构是什么
- 使用 Kruskal 算法查找最小生成树的错误
- Kruskal的最小生成树算法
- 带Boost的最小生成树
- 在实现最小生成树的 Prim 算法时,逻辑错误是什么?
- 使用prim算法的最小生成树,不知道出了什么问题
- 弗洛伊德算法(最短路径)问题 - C++