多个根结点的最下生成树怎么用prim算法或者kruskal算法得出给出过程和Matlab代码
多个根结点的最下生成树可以用Prim算法或者Kruskal算法来得出。这里给出Prim算法的过程和Matlab代码。
Prim算法过程:
- 选择一个根结点,将其加入最下生成树。
- 将与该根结点相邻的边加入集合。
- 选择一个未加入树的结点,且与已加入树的结点相邻的边权值最小,将其加入最下生成树。
- 将与该结点相邻的边加入集合。
- 重复步骤3和4,直到所有结点都加入最下生成树为止。
Matlab代码:
function [T, cost] = prim(graph, root)
% graph: 邻接矩阵表示的图
% root: 根结点
% T: 最下生成树的邻接矩阵表示
% cost: 最小生成树的权值和
n = size(graph, 1); % 图的结点数
T = zeros(n); % 最下生成树的邻接矩阵表示
visited = false(1, n); % 记录结点是否已经加入树中
visited(root) = true; % 选定根结点
cost = 0;
while sum(visited) < n
min_edge = inf;
min_i = -1;
min_j = -1;
% 找到一条边权值最小的边
for i = 1:n
if visited(i)
[~, j, w] = find(graph(i, :));
for k = 1:length(j)
if ~visited(j(k)) && graph(i, j(k)) < min_edge
min_edge = graph(i, j(k));
min_i = i;
min_j = j(k);
end
end
end
end
% 将该边加入最下生成树
T(min_i, min_j) = min_edge;
T(min_j, min_i) = min_edge;
visited(min_j) = true;
cost = cost + min_edge;
end
Matlab代码解释:
该代码使用了邻接矩阵表示图,visited数组记录结点是否已经加入最下生成树中,T数组记录最下生成树的邻接矩阵表示,cost记录最小生成树的权值和。在主循环中,每次找到与已经加入树中结点相邻的边权值最小的未加入树中的结点,将其加入树中,并将该边加入最下生成树中。最后返回最下生成树和最小生成树的权值和。
Kruskal算法同样可以用于求解多个根结点的最下生成树,但需要稍作修改。具体实现方法可以参考以下链接:
https://www.cnblogs.com/ECJTUACM-873284962/p/7211335.html
https://blog.csdn.net/weixin_43193924/article/details/8383659
原文地址: https://www.cveoy.top/t/topic/fMsO 著作权归作者所有。请勿转载和采集!