最小生成树算法网上好多:
Kruskal 和 Prim的课本都有, 网上也有, 唯独Sollin的比较少, 原因是比较少用...这里为Sollin增添一篇.
步骤:
1. 开始时, 每个节点自为一棵树. 遍历每个节点, 对于每个节点, 找出与其相连的节点中代价最小的边, 然后连接. (允许出现重复)
2. 步骤1后会生成多棵不相连的树. 此时对于每棵树, 找出与其相连的树中代价最小的边, 然后连接生成一棵新的树, 直到只有一棵树, 那就是最小生成树
输入:
输入的是一个二维无向图矩阵(对称矩阵)
输出是生成的最小生成树的二维无向图矩阵.
难点:
步骤1后, 代码如何表示不同树的集合.(例如, 节点2, 3, 4经过步骤1后形成了一棵树, 节点0, 5形成另一棵树, 如何将这两堆节点所属的两棵树表现出来)
步骤2中, 如何进行树的合并.
解决:
对于难点1, 我们用一个数组来解决. 假如有7个节点从0~6. 经过步骤1后形成3棵树, 节点0,5为一棵, 节点1,6为一棵, 节点2,3,4为一棵.则用数组表示为:
node0 | node1 | node2 | node3 | node4 | node5 | node6 |
7 | 8 | 9 | 9 | 9 | 7 | 8 |
数字相同代表是同一棵树, 树的标识根据节点个数决定, 如果节点个数为10, 则树的标识从10开始, 因为下标不可能超过10.
难点1解决后, 难点2迎刃而解, 在做合并操作时, 从标识码最小的树开始, 这里为7, 即0,5节点. 搜寻0, 5节点中跟其它树相连的最小代价的出边, 然后连接. 并将0, 5节点的树标识改为连接后的树的标识. 例如, 5跟4的边最小代价, 4是属于标识号为9的树, 连接后, 0,5节点的标识也要改为9.
然后对树8(一直递增)进行合并, 重复上述操作直至只剩下一棵树为止. 这棵树就是最小生成树.
Program environment: Operation System: Ubuntu 14.04 Ide: Eclipse Compiler: g++ Language: c++
Requirements:
Implement the Sollin’s algorithm.
Ideas:
Three steps for a n graph vertices, at the beginning, each vertex represent a tree.
1st step: for each tree, select the minimum cost edge from its neighbor.
2nd step: represent all the trees in this graph.
3rd step: merge each two trees with the minimum cost edge until only one tree in the graph.
The main problems are how to represent each disjoint tree and how to merge.
To solve the former problem, i use an array as representation. Those vertices i