Lema: Si hay un borde V -> Y e Y también es un sucesor indirecto de V (por ejemplo, V -> W -> + Y), entonces el borde V -> Y es transitivo y no forma parte de la raíz transitiva.
Método: realice un seguimiento del cierre transitivo de cada vértice, trabajando desde los vértices terminales a los iniciales en orden topológico inverso. El conjunto de sucesores indirectos de V es la unión de los cierres transitivos de los sucesores inmediatos de V. El cierre transitivo de V es la unión de sus sucesores indirectos y sus sucesores inmediatos.
Algoritmo:
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.
Esto supone que tiene una forma eficiente de realizar un seguimiento de los conjuntos de vértices (por ejemplo, mapas de bits), pero creo que esta suposición también se realiza en otros algoritmos O (V + E).
Un efecto secundario potencialmente útil es que encuentra el cierre transitivo de cada vértice de G.