Reputation: 1270
I have a list of edges as follows.
75 77
77 78
78 79
60 63
61 65
65 67
57 62
62 64
67 81
81 85
I want to separate the connected edges as follows.
75 60 61 57
77 63 65 62
78 67 64
79 81
85
I wrote the following code in Matlab.
edges = [75 77; 77 78; 78 79; 60 63; 61 65; 65 67; 57 62; 62 64; 67 81; 81 85];
visited = zeros(size(edges,1),1);
cEdges = [];
cEdgesC = 1;
cEdges(1,cEdgesC) = edges(1,1);
cEdges(2,cEdgesC) = edges(1,2);
visited(1,1) = 1;
orgR = 1;
orgC = 2;
while sum(visited) <= size(visited,1)
cEdgesR = nnz(cEdges(:,cEdgesC));
currentVertex = cEdges(cEdgesR,cEdgesC);
fprintf('\n%d\t%d',cEdgesR,currentVertex);
[foundR,foundC] = find(edges==currentVertex);
foundR(foundR==orgR) = [];
foundC(foundC==orgC) = [];
while isempty(foundR)
fmt=repmat('%d ',1,cEdgesR);
fprintf('\nLoop found: ');
fprintf(fmt,(cEdges(:,cEdgesC))');
cEdgesC = cEdgesC+1;
orgR = find(visited==0, 1, 'first');
orgC = 1;
cEdges(1,cEdgesC) = edges(orgR,orgC);
cEdges(2,cEdgesC) = edges(orgR,orgC+1);
visited(orgR,1) = 1;
cEdgesR = nnz(cEdges(:,cEdgesC));
currentVertex = cEdges(2,cEdgesC);
fprintf('\n%d\t%d',cEdgesR,currentVertex);
[foundR,foundC]=find(edges==currentVertex);
foundR(foundR==orgR) = [];
foundC(foundC==orgC) = [];
if isempty(foundR)
// What to do here?
end
end
fprintf('\t%d\t%d',foundR,foundC);
orgR = foundR;
if foundC == 1
cEdges(cEdgesR+1,1) = edges(foundR,foundC+1);
orgC = foundC+1;
else
cEdges(cEdgesR+1,1) = edges(foundR,foundC-1);
orgC = foundC-1;
end
visited(foundR,1) = 1;
end
The code runs in a loop with no stop. I feel problem is at the end of inner while loop. How may I jump back to the beginning of inner while loop if the same condition is met at the end again? Thank you.
Edit: Example larger matrix of edges.
Upvotes: 1
Views: 107
Reputation: 1270
I solved it including cyclic cases and backward connections as well. Just thought to post for the sake of anyone interested in.
edges = [75 77; 77 78; 78 79; 60 63; 61 65; 65 67; 57 62; 62 64; 67 81; 81 85];
visited = zeros(size(edges,1),1);
cEdges = [];
cEdgesC = 1;
cEdges(1,cEdgesC) = edges(1,1);
cEdges(2,cEdgesC) = edges(1,2);
visited(1,1) = 1;
orgR = 1;
orgC = 2;
cEdgesR = nnz(cEdges(:,cEdgesC));
currentVertex = cEdges(cEdgesR,cEdgesC);
loops = 0;
while sum(visited) < size(visited,1)
i=0;
found=0;
while i<size(edges,1)
i=i+1;
if edges(i,1)==currentVertex && visited(i,1)==0
cEdgesR = nnz(cEdges(:,cEdgesC));
cEdges(cEdgesR,cEdgesC)=edges(i,1);
cEdges(cEdgesR+1,cEdgesC)=edges(i,2);
currentVertex = cEdges(cEdgesR+1,cEdgesC);
visited(i,1)=1;
i=0;
found=1;
elseif edges(i,2)==currentVertex && visited(i,1)==0
cEdgesR = nnz(cEdges(:,cEdgesC));
cEdges(cEdgesR,cEdgesC)=edges(i,2);
cEdges(cEdgesR+1,cEdgesC)=edges(i,1);
currentVertex = cEdges(cEdgesR+1,cEdgesC);
visited(i,1)=1;
i=0;
found=1;
end
end
if found==0
fprintf('\nloop: ');
loops = loops+1;
loopVs = nnz(cEdges(:,loops));
for j=1:loopVs
fprintf('\t%d',cEdges(j,loops));
end
cEdgesT = cEdges.';
cEdgesC = nnz(cEdgesT(:,1))+1;
cEdgesR = 1;
nextEi = find(visited==0, 1, 'first');
cEdges(1,cEdgesC) = edges(nextEi,1);
cEdges(2,cEdgesC) = edges(nextEi,2);
visited(nextEi,1) = 1;
currentVertex = cEdges(2,cEdgesC);
end
end
fprintf('\nno. of loops = %d',loops);
Upvotes: 0
Reputation: 3677
If you not consider cyclic cases and backward connection than this should be easy problem.
edges = [75 77; 77 78; 78 79; 60 63; 61 65; 65 67; 57 62; 62 64; 67 81; 81 85];
NumEdges=size(edges,1);
visited = false(NumEdges,1);
List=cell(0);
k=0;
for i=1:NumEdges
if ~visited(i)
k=k+1;
List{k}=edges(i,1);
Idx=i;
while ~isempty(Idx)
visited(Idx)=true;
List{k}(end+1)=edges(Idx,2);
Idx=find(edges(:,1)==edges(Idx,2) & ~visited,1);
end
end
end
celldisp(List)
Upvotes: 1