Мета цього завдання задається кінцево спрямованим ациклічним графіком (DAG), визначають, чи є графік транзитивним скороченням .
Коротке пояснення, що таке 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 хвилин на будь-якому обладнання). Застосовуються стандартні лазівки. Ви можете використовувати будь-які бажані вбудовані модулі.

