Целью этой задачи является конечно- ориентированный ациклический граф (DAG), определить, является ли граф транзитивной редукцией .
Краткое объяснение того, что такое DAG и переходные сокращения:
DAG - это граф с направленными ребрами (то есть вы можете перемещаться только в одном направлении по этому ребру), так что при наличии любого начального узла на графике невозможно вернуться к начальному узлу (то есть циклов нет).
Для любого начального узла, если возможно перейти к другому конечному узлу в графе через любое произвольное положительное число ребер, то этот конечный узел определяется как достижимый из начального узла. В общей группе обеспечения доступности баз данных может быть несколько путей, которые могут быть взяты от начального узла к целевому конечному узлу. Например, возьмите этот граф алмазов:
Чтобы добраться до узла D
с A
, вы могли бы пойти по пути A->B->D
или A->C->D
. Таким образом, D
достижимо из A
. Однако нет пути, по которому можно добраться до узла, B
начиная с узла C
. Таким образом, узел B
не доступен с узла C
.
Определите достижимость графа как список достижимых узлов для каждого начального узла в графе. Таким образом, для того же примера алмазного графика достижимость:
A: [B, C, D]
B: [D]
C: [D]
D: []
Другой график, который имеет ту же достижимость, что и приведенный выше график, показан ниже:
Однако этот второй граф имеет больше ребер, чем исходный граф. Транзитивная редукция графа - это граф с наименьшим числом ребер и такой же достижимостью исходного графа. Таким образом, первый граф является транзитивной редукцией второго.
Для конечного DAG транзитивное сокращение гарантированно существует и является уникальным.
вход
Входные данные представляют собой «список списков», где внешний список имеет длину числа вершин, а каждый внутренний список - длину числа ребер, покидающих связанный узел, и содержит индексы узлов назначения. Например, один из способов описать первый график выше (при условии индексации на основе нуля):
[[1, 2], [3], [3], []]
Вы можете начать индексирование первого узла с любого произвольного целочисленного значения (например, индексация на основе 0 или 1).
Вход может поступать из любого источника входного сигнала (stdio, параметр функции и т. Д.). Вы можете выбрать точный формат ввода, если дополнительная информация не указана. Например, если вы хотите получить входные данные из stdio, каждая строка может быть списком ребер для связанного узла. Напр .:
1 2
3
3
'' (blank line)
Индексы в каждом списке смежности не обязательно сортируются, и может быть несколько ребер, соединяющих два узла (например:) [[1,1],[]]
. Вы можете предположить, что входной граф слабо связан и не содержит циклов (то есть это DAG).
Выход
Вывод верен, если заданная входная группа DAG является транзитивным сокращением, а в противном случае - ложным значением. Это может быть любой желаемый приемник (stdio, возвращаемое значение, выходной параметр и т. Д.)
Примеры
Во всех примерах используется индексация на основе 0.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
счет
Это код гольф; выигрывает наименьший код в байтах. Ваш код должен завершиться за разумное время (максимум 10 минут на любом оборудовании). Применяются стандартные лазейки. Вы можете использовать любые встроенные модули по желанию.
источник
Ответы:
Рубин,
10197 байтПростой подход, который вычисляет охват каждого узла и рассматривает возможность доступа к дочернему узлу через любой из других узлов. Кажется, что на циклических графах происходит сбой, но определение DAG подразумевает, что он не должен быть циклическим в любом случае.
Попробуйте онлайн!
источник
Mathematica,
9582 байта13 байтов сохранено благодаря @MartinEnder .
Анонимная функция. Принимает вложенный список как вход (на основе 1) и возвращает
True
илиFalse
как вывод. Основным решением здесь является 46-байт#~IsomorphicGraphQ~TransitiveReductionGraph@#&
, который проверяет, является ли данный граф изоморфным его транзитивной редукции. Остальное преобразует входные данные вGraph
объект.источник
CJam (41 байт)
Демо-версия , тестовый жгут
рассечение
источник
Желе, 20 байт
Использует индексирование на основе 1. Попробуйте онлайн!
Свободный Обзор
источник