Daniel@0: function [t,nk] = minspan(IJC) Daniel@0: %MINSPAN Minimum weight spanning tree using Kruskal algorithm. Daniel@0: %[t,nk] = minspan(IJC) Daniel@0: % IJC = n x 3 matrix arc list [i j c] of arc heads, tails, and costs Daniel@0: % t = n-element logical vector, where Daniel@0: % t(i) = 1, if IJC(i,:) arc in spanning tree Daniel@0: % t(i) = k, if IJC(i,:) arc in component k of forest Daniel@0: % nk = number of components Daniel@0: Daniel@0: % Copyright (c) 1998-2001 by Michael G. Kay Daniel@0: % Matlog Version 5 22-Aug-2001 Daniel@0: Daniel@0: % Input Error Checking ****************************************************** Daniel@0: [n,cIJC] = size(IJC); Daniel@0: if cIJC ~= 3 Daniel@0: error('''IJC'' must be a 3-column matrix.') Daniel@0: elseif n < 1 Daniel@0: error('''IJC'' must have at least one row.') Daniel@0: elseif any(IJC(:,1) < 1) | any(any(~isint(IJC(:,[1 2])))) Daniel@0: error('Invalid arc index in IJC.') Daniel@0: end Daniel@0: % End (Input Error Checking) ************************************************ Daniel@0: Daniel@0: i = IJC(:,1); j = abs(IJC(:,2)); Daniel@0: m = max(max([i j])); Daniel@0: Daniel@0: sidxIJ = argsort(IJC(:,3)); Daniel@0: i = i(sidxIJ); j = j(sidxIJ); Daniel@0: Daniel@0: t = logical(zeros(n,1)); Daniel@0: k = 1; % Current arc Daniel@0: nt = 0; % Number of arcs in spanning tree Daniel@0: v = (1:m)'; % Arc labels Daniel@0: Daniel@0: while nt < m - 1 & k <= n Daniel@0: if (v(i(k)) ~= v(j(k))) Daniel@0: v(v==v(j(k))) = v(i(k)); Daniel@0: t(k) = 1; Daniel@0: nt = nt + 1; Daniel@0: end Daniel@0: k = k + 1; Daniel@0: end Daniel@0: Daniel@0: idxIJ = invperm(sidxIJ); Daniel@0: t = t(idxIJ); i = i(idxIJ); j = j(idxIJ); Daniel@0: Daniel@0: c = unique(v(unique([i; j]))); % Unique labels of arc vertices Daniel@0: nk = length(c); Daniel@0: if ~any(t), nk = 0; end % Self-loop not a component Daniel@0: Daniel@0: if nk > 1 Daniel@0: for k = 1:nk Daniel@0: t(t~=0 & v(i)==c(k)) = k; % Relabel to consecutive component numbers Daniel@0: end Daniel@0: end Daniel@0: