Ответ 1
A ориентированный граф с недифференцированными ребрами может иметь каждую вершину, представленную просто как массив вершин, доступных из этой вершины. Если график имел циклы, у вас был бы "рекурсивный массив", особенно если ребро могло вернуться к той же вершине.
Например, этот график:
... может быть представлена в коде как:
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=>[]}
Обычно представление каждой вершины было бы более "надежным" (например, экземпляр класса со свойствами для имени и массива исходящих ребер), но не представляется возможным представить себе случай, когда вам нужно очень легкое представление ваших данных (для очень больших графиков) и поэтому необходимо использовать минимальное представление, подобное этому.