FormationControlSimulation/SOURCE/networks-toolbox/minSpanTree.m

38 lines
1.1 KiB
Matlab
Raw Normal View History

2019-06-17 14:31:50 +07:00
% Prim's minimal spanning tree algorithm
% Prim's alg idea:
% start at any node, find closest neighbor and mark edges
% for all remaining nodes, find closest to previous cluster, mark edge
% continue until no nodes remain
%
% INPUTS: graph defined by adjacency matrix, nxn
% OUTPUTS: matrix specifying minimum spanning tree (subgraph), nxn
%
% Other routines used: isConnected.m
% GB: Oct 7, 2012
function tr = minSpanTree(adj)
% check if graph is connected:
if not(isConnected(adj)); printf('This graph is not connected. No spanning tree exists.\n'); return; end
n = length(adj); % number of nodes
tr = zeros(n); % initialize tree
adj(find(adj==0))=inf; % set all zeros in the matrix to inf
conn_nodes = 1; % nodes part of the min-span-tree
rem_nodes = [2:n]; % remaining nodes
while length(rem_nodes)>0
[minlink]=min(min(adj(conn_nodes,rem_nodes)));
ind=find(adj(conn_nodes,rem_nodes)==minlink);
[ind_i,ind_j] = ind2sub([length(conn_nodes),length(rem_nodes)],ind(1));
i=conn_nodes(ind_i); j=rem_nodes(ind_j); % gets back to adj indices
tr(i,j)=1; tr(j,i)=1;
conn_nodes = [conn_nodes j];
rem_nodes = setdiff(rem_nodes,j);
end