Lemma: Jika ada tepi V -> Y dan Y juga merupakan penerus tidak langsung dari V, (misalnya, V -> W -> + Y) maka tepi V -> Y adalah transitif dan bukan bagian dari akar transitif.
Metode: Melacak penutupan transitif dari setiap simpul, bekerja dari terminal ke simpul awal dalam urutan topologi terbalik. Himpunan penerus tidak langsung dari V adalah penyatuan dari penutupan transitif dari penerus langsung dari V. Penutupan transitif dari V adalah penyatuan dari penerus tidak langsung dan penerus langsungnya.
Algoritma:
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.
Ini mengasumsikan bahwa Anda memiliki beberapa cara yang efisien untuk melacak set simpul (misalnya, peta bit), tetapi saya pikir asumsi ini dibuat dalam algoritma O (V + E) lainnya juga.
Efek samping yang berpotensi berguna adalah ia menemukan penutupan transitif dari setiap simpul G.