www.pudn.com > ConstrainedEM.zip > connected_components.m


function [ comps, singles ]=connected_components(gr)
% singles is a list of indexes of single nodes ( unconnected )
% comps is a cell. each cell contains the indexes of a component

n=length(gr);
not_visited=ones(1,n);
sc=1;	% singles counter
cc=1;	% clusters counter
singles=[];
comps=[];

for i=1:n
   if (not_visited(i)==1)
      if sum(gr(i,:))==0
         singles(sc)=i;
         sc=sc+1;
      else
         queue=i;
         not_visited(i)=0;
         ccc=1;	% current cluster counter
         while (~isempty(queue))
            ind=queue(end);	% remove from queue
            comps{cc}(ccc)=ind;	% write in comps record
            ccc=ccc+1;
       
            nei=find( (gr(ind,:).*not_visited) ==1 );
            not_visited(nei)=0;
            queue=[ queue(1:end-1) nei ];	 
         end
         cc=cc+1;
      end
   end
end