A directed graph con bordes indiferenciados podría representarse cada vértice simplemente como una matriz de los vértices alcanzables desde ese vértice. Si el gráfico tuviera ciclos, tendrías una 'matriz recursiva', especialmente si un borde pudiera conducir al mismo vértice.
Por ejemplo, este gráfico:
... podría estar representado en código como:
nodes = { a:[], b:[], c:[], d:[] }
nodes[:a] << nodes[:a]
nodes[:a] << nodes[:b]
nodes[:b] << nodes[:a]
nodes[:b] << nodes[:c]
p nodes
#=> {:a=>[[[...], []], [...]], :b=>[[[...], [...]], []], :c=>[], :d=>[]}
Por lo general, la representación de cada vértice habría más (por ejemplo, una instancia 'robusto' clase con propiedades para el nombre y la matriz de bordes salientes), pero no es imposible imaginar un caso en el que quisiera una representación muy ligera de sus datos (para gráficos muy grandes) y, por lo tanto, necesite utilizar una representación mínima como esta.
Tenga en cuenta que este ejemplo es fácil, ya que 'a.first' y' a' son exactamente el mismo objeto (el mismo 'object_id'). Ruby también admite la comparación de estructuras recursivas independientes (por ejemplo, 'b = []; b << b; a == b # => true'). –