code: function exchange(graph, tree, e, f) {
    tree.delEdge(e);
    var source = graph.source(f);
    var target = graph.target(f);
  
    // Redirect edges so that target is the root of its subtree.
    function redirect(v) {
      var edges = tree.inEdges(v);
      for (var i in edges) {
        var e = edges[i];
        var u = tree.source(e);
        var value = tree.edge(e);
        redirect(u);
        tree.delEdge(e);
        value.reversed = !value.reversed;
        tree.addEdge(e, v, u, value);
      }
    }
  
    redirect(target);
  
    var root = source;
    var edges = tree.inEdges(root);
    while (edges.length > 0) {
      root = tree.source(edges[0]);
      edges = tree.inEdges(root);
    }
  
    tree.graph().root = root;
  
    tree.addEdge(null, source, target, {cutValue: 0});
  
    initCutValues(graph, tree);
  
    adjustRanks(graph, tree);
  }
docs: /*
  Replace edge e with edge f in the tree, recalculating the tree root,
  the nodes' low and lim properties and the edges' cut values.