code: function acyclic(g) {
    var onStack = {},
        visited = {},
        reverseCount = 0;
    
    function dfs(u) {
      if (u in visited) return;
      visited[u] = onStack[u] = true;
      g.outEdges(u).forEach(function(e) {
        var t = g.target(e),
            value;
  
        if (u === t) {
          console.error('Warning: found self loop "' + e + '" for node "' + u + '"');
        } else if (t in onStack) {
          value = g.edge(e);
          g.delEdge(e);
          value.reversed = true;
          ++reverseCount;
          g.addEdge(e, t, u, value);
        } else {
          dfs(t);
        }
      });
  
      delete onStack[u];
    }
  
    g.eachNode(function(u) { dfs(u); });
  
    util.log(2, 'Acyclic Phase: reversed ' + reverseCount + ' edge(s)');
  
    return reverseCount;
  }
docs: /*
  This function takes a directed graph that may have cycles and reverses edges
  as appropriate to break these cycles. Each reversed edge is assigned a
  `reversed` attribute with the value `true`.
  
  There should be no self loops in the graph.