Если в графе нет цикла, т. Е. Граф является направленным ациклическим графом (DAG), то нам просто нужно посчитать степени для каждого узла. Множество узлов с степенью 0 является обязательным.
Если вы не знакомы с градусом, если есть ребро a-> b , то степень b увеличивается на 1.
Это работает, потому что, если существует ребро a-> b , то есть b имеет степень, это означает, что существует узел a , из которого b достижимо. Поэтому всегда лучше включать в набор узел a вместо b . Узел с нулевой степенью 0 не имеет другого способа посещения, если только мы не начнем с самого узла. Так что он будет включен в набор.
Если на графике есть цикл, мы ищем Сильно Связанные Компоненты (SCC). Затем мы строим новый граф с учетом SCC как одного узла и добавляем ребра из исходного графа, которые соединяют два разных SCC. Новый график будет DAG. Затем мы можем применить вышеописанную процедуру, чтобы найти необходимый набор узлов.