Итак, получается следующая картина.
Задача. Дан список порядков вершин предполагаемого графа, надо:
- Убедиться, что существует "химическая формула" для такого списка, т.е. связный мультиграф.
- Если существует, построить любой пример.
На первый вопрос можно ответить численно, проверив следующие критерии:
- Сумма порядков является четной
- Полусумма порядков больше или равна числу вершин, уменьшенному на
- Наибольший порядок меньше или равен сумме остальных порядков
Мне было интересно попытаться построить сам граф, да и вопрос существования решить не численным, а алгоритмическим путем.
В
данной статье приведены необходимые алгоритмы, которые я реализовал на Wolfram Mathematica.
Краткое описание:
- Произвольным образом привязываем к каждому порядку номер вершины (вложенный список, словарь и т.д.)
- Сортируем порядки по убыванию
- Выбираем (один из) наибольших и (один из) наименьших
- Уменьшаем каждый из них на 1 и добавляем ребро, соединяющее соответствующие вершины
- Удаляем порядки равные 0. Если (в одной из итераций) оба порядка стали нулевыми,
значит полученный мультиграф будет несвязным. Мы можем продолжить его построение,
либо сразу сделать останов с сообщением Non connected - Если остался один ненулевой элемент, значит граф (даже несвязный!) построить нельзя.
Останов с сообщением None - Если осталось пустое множество, мы достигли результата, либо продолжаем итерации с п.2
Данный алгоритм строит
один из возможных графов. Например, для списка порядков
получается следующий простой, но
непланарный граф:
хотя предполагается что это должна быть "молекула тетразета":
Но химическое соединение может быть непланарным, поэтому свою задачу алгоритм выполняет.
И еще пример результата работы алгоритма:
Список порядков:
Граф: