У меня есть DAG, представляющая список свойств. Эти свойства таковы, что если a> b, то a имеет направленное ребро к b. Он также транзитивен, так что если a> b и b> c, то a имеет направленное ребро к c.
Однако направленный край от a до c является излишним, потому что a имеет направленный край к b, а b имеет направленный край к c. Как я могу обрезать все эти лишние края? Я думал об использовании алгоритма минимального связующего дерева, но я не совсем уверен, какой алгоритм следует применять в этой ситуации
Полагаю, я мог бы сначала выполнить поиск по глубине из каждого узла и всех его исходящих ребер и сравнить, сможет ли он достичь определенных узлов, не используя определенные ребра, но это выглядит ужасно неэффективно и медленно.
После завершения алгоритма на выходе будет линейный список всех узлов в порядке, соответствующем графику. Таким образом, если a имеет три направленных ребра к b, c и d. b и c, также каждый из которых имеет направленный край к d, выход может быть либо abcd, либо acbd.