code: public static <N> Traverser<N> forGraph(SuccessorsFunction<N> graph) {
      checkNotNull(graph);
      return new GraphTraverser<>(graph);
    }
docs: Creates a new traverser for the given general {@code graph}.
  
  <p>Traversers created using this method are guaranteed to visit each node reachable from the
  start node(s) at most once.
  
  <p>If you know that no node in {@code graph} is reachable by more than one path from the start
  node(s), consider using {@link #forTree(SuccessorsFunction)} instead.
  
  <p><b>Performance notes</b>
  
  <ul>
  <li>Traversals require <i>O(n)</i> time (where <i>n</i> is the number of nodes reachable from
  the start node), assuming that the node objects have <i>O(1)</i> {@code equals()} and
  {@code hashCode()} implementations. (See the <a
  href="https://github.com/google/guava/wiki/GraphsExplained#elements-must-be-useable-as-map-keys">
  notes on element objects</a> for more information.)
  <li>While traversing, the traverser will use <i>O(n)</i> space (where <i>n</i> is the number
  of nodes that have thus far been visited), plus <i>O(H)</i> space (where <i>H</i> is the
  number of nodes that have been seen but not yet visited, that is, the "horizon").
  </ul>
  
  @param graph {@link SuccessorsFunction} representing a general graph that may have cycles.