38 lines
1.1 KiB
Matlab
38 lines
1.1 KiB
Matlab
% 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 |