Предположим, что у меня есть ориентированный граф с одним корнем и без циклов. Я хотел бы добавить тип на каждом узле (например, как целое с некоторой пользовательской упорядоченности) со следующим свойством:Кодирование ориентированного графа как числа
if Node1.type <= Node2.type then there exists a path from Node1 to Node2
Заметим, что топологическая сортировка фактически удовлетворяет обращенную свойство:
if there exists a path from Node1 to Node2 then Node1.type <= Node2.type
поэтому его здесь нельзя использовать.
Обратите внимание, что целые числа с естественным порядком не могут использоваться здесь, потому что можно сравнить два целых числа, то есть упорядочение целых чисел является линейным, а дерево не обязательно должно быть.
Итак, вот пример. Предположим, что граф имеет 4 узла A, B, C, D
и 4 стрелы:
A->B, A->C, B->D, C->D
Так что это бриллиант. Теперь мы можем поставить
A.type = 00
B.type = 01
C.type = 10
D.type = 11
где с правой стороны у нас есть целые числа в двоичном формате. Сравнение определяется побитовое:
(X <= Y) if and only if (n-th bit of X <= n-th bit of Y for all n)
Так что я думаю, такое упорядочение может быть использован, вопрос в том, как построить значения из данного графа? Я даже не уверен, что решение всегда существует. Любые намеки?
UPDATE: Поскольку существуют некоторое недопонимание о терминологии, которую я использую, позвольте мне быть больше Явным: Я заинтересован в ориентированном ациклическом графе, что существует ровно один узел без предшественников (он же корень) и есть в одна стрелка между любыми двумя узлами. Примером может служить алмаз. Он не должен иметь один лист (т. Е. Узел без преемников). Каждый узел может иметь несколько предшественников и несколько преемников. Вы можете сказать, что это частично упорядоченный набор с наименьшим элементом (т. Е. Уникальный глобально минимальный элемент).
Если 'Node1.type <= Node2.type' никогда не выполняется, требование тривиально выполняется , –
@ н.м. Я не уверен, что понимаю, поразмыслить? – freakish
Если 'a