-------------------------------------------------------------------------------------------------
Algorithm For Nearest Neighbor Undirected Weighted Graph
-------------------------------------------------------------------------------------------------
===== INPUT =====
In[]:=
vertices={"A","B","C","D","E","F","G","H"};
Adjacency Matrix:
Symmetric matrix assumed.
A zero entry means no connection.
A zero row means an isolated vertex.
In[]:=
adjM=​​{{0,0.1,0.4,0.2,0,0,0,0},​​{0.1,0,0.1,0.5,0,0,0,0},​​{0.4,0.1,0,0.3,0,0,0,0},​​{0.2,0.5,0.3,0,0,0,0,0},​​{0,0,0,0,0,0,0,0},​​{0,0,0,0,0,0,0.15,0.25},​​{0,0,0,0,0,0.15,0,0.35},​​{0,0,0,0,0,0.25,0.35,0}};
​
===== COMPUTATION =====
In[]:=
vcount=Length[vertices]
Out[]=
8
In[]:=
zerorows=Table[(Sum[Abs[Extract[Extract[adjM,i],j]],{j,1,vcount}]0),{i,1,vcount}]
Out[]=
{False,False,False,False,True,False,False,False}
In[]:=
vindexhash=CreateDataStructure["HashTable"];
In[]:=
Do[vindexhash["Insert",Extract[vertices,i]i],{i,1,vcount}];
In[]:=
nonzeroweights=Table[​​If[(Extract[zerorows,i]True),{∞},Select[Extract[adjM,i],(#≠0)&]],{i,1,vcount}]
Out[]=
{{0.1,0.4,0.2},{0.1,0.1,0.5},{0.4,0.1,0.3},{0.2,0.5,0.3},{∞},{0.15,0.25},{0.15,0.35},{0.25,0.35}}
In[]:=
minweights=Table[Min[Extract[nonzeroweights,i]],{i,1,vcount}]
Out[]=
{0.1,0.1,0.1,0.2,∞,0.15,0.15,0.25}
In[]:=
nneighbors=Table[​​If[(Extract[zerorows,i]True),{Extract[vertices,i]},​​Table[If[Extract[minweights,i]Extract[Extract[adjM,i],j],Extract[vertices,j],Nothing],{j,1,vcount}]],{i,1,vcount}]
Out[]=
{{B},{A,C},{B},{A},{E},{G},{F},{F}}
here’s where it’s assumed to be undirected
In[]:=
edgepairs=DeleteDuplicates[Flatten[Table[Sort[{Extract[vertices,i],#}]&/@Extract[nneighbors,i],{i,1,vcount}],1]]
Out[]=
{{A,B},{B,C},{A,D},{E,E},{F,G},{F,H}}
In[]:=
edgepaircount=Length[edgepairs]
Out[]=
6
In[]:=
edgepairindices=Table[vindexhash["Lookup",#]&/@Extract[edgepairs,p],{p,1,edgepaircount}]
Out[]=
{{1,2},{2,3},{1,4},{5,5},{6,7},{6,8}}
In[]:=
edgepairweights=Table[​​If[Extract[zerorows,Extract[Extract[edgepairindices,p],1]]True,∞,​​Extract[Extract[adjM,Extract[Extract[edgepairindices,p],1]],Extract[Extract[edgepairindices,p],2]]],​​{p,1,edgepaircount}]
Out[]=
{0.1,0.1,0.2,∞,0.15,0.25}
​
===== OUTPUT =====
In[]:=
leastedges=Table[​​Annotation[​​Extract[Extract[edgepairs,p],1]Extract[Extract[edgepairs,p],2],​​EdgeWeightExtract[edgepairweights,p]],​​{p,1,edgepaircount}]
Out[]=
{AB,BC,AD,EE,FG,FH}
In[]:=
nng=Graph[leastedges,​​VertexLabelsAll,​​VertexLabelStyle"Medium",​​EdgeLabels"EdgeWeight",​​EdgeLabelStyleMedium,​​GraphLayout"RadialDrawing",​​ImageSizeSmall]
Out[]=