学了一天最小生成树,稍稍总结一下,这是第一篇
kruskal算法
关于kruskal算法已有大量的资料,不再赘述,算法流程为:
得到邻接矩阵和权值;
初始化,连接距离最小的两点;
连接距离次小的两点,如果形成回路则取消连接;重复上述连接步骤,直到所有n个节点被n-1条边连接成树。
并查集
关于并查集的可以看一下这篇:《一个很有意思的并查集详解》。
下面给出两个子函数,一个用于寻找根节点(RootNode),一个用于合并(MergeNode)。第二个函数加入了压缩选项,压缩的话计算量小一些,默认为压缩。
需要注意的是,并查集有很多的应用,kruskal只是冰山一角。
%% 并查集
% Node = RootNode(Node,Father)
% 输入:Node:需要查询的节点
% Father:记录父节点的向量
% 输出:父节点
function Node = RootNode(Node,Father) % 找到根结点
for i=1:length(Node)
while(Node(i)~=Father(Node(i)))
Node(i) = Father(Node(i));
end
end
end
%% 并查集
% Father = MergeNode(Node1,Node2,Father)
% 输入:Node