```
pub fn dag_transitive_reduction_closure<E, Ix>(
g: &List<E, Ix>
) -> (List<(), Ix>, List<(), Ix>)where
Ix: IndexType,
```

## Expand description

Computes the transitive reduction and closure of a DAG.

The algorithm implemented here comes from On the calculation of transitive reduction-closure of orders by Habib, Morvan and Rampon.

The input graph must be in a very specific format: an adjacency list such that:

- Node indices are a toposort, and
- The neighbors of all nodes are stored in topological order.
To get such a representation, use the function
`dag_to_toposorted_adjacency_list`

.

The output is the pair of the transitive reduction and the transitive closure.

Runtime complexity: **O(|V| + \sum_{(x, y) \in Er} d(y))** where **d(y)**
denotes the outgoing degree of **y** in the transitive closure of **G**.
This is still **O(|V|³)** in the worst case like the naive algorithm but
should perform better for some classes of graphs.

Space complexity: **O(|E|)**.