Лема: Якщо є край V -> Y, а Y також є непрямим наступником V (наприклад, V -> W -> + Y), то край V -> Y є перехідним і не є частиною перехідного кореня.
Метод: слідкуйте за перехідним закриттям кожної вершини, працюючи від кінцевих до початкових вершин у зворотному топологічному порядку. Сукупність непрямих наступників V - це об’єднання перехідних замкнень безпосередніх наступників В. Перехідне закриття V - це об'єднання її непрямих наступників та його безпосередніх наступників.
Алгоритм:
Initialise Visited as the empty set.
For each vertex V of G,
Invoke Visit(V).
Visit(V):
If V is not in Visited,
Add V to Visited,
Initialise Indirect as the empty set,
For each edge V -> W in G,
Invoke Visit(W),
Add Closure(W) to Indirect.
Set Closure(V) to Indirect.
For each edge V -> W in G,
Add W to Closure(V),
If W is in the set Indirect,
Delete the edge V -> W from G.
Це передбачає, що у вас є ефективний спосіб відстеження наборів вершин (наприклад, бітових карт), але я думаю, що це припущення зроблено і в інших алгоритмах O (V + E).
Потенційно корисним побічним ефектом є те, що він знаходить перехідне закриття кожної вершини G.