import java.util.*; abstract public class Graph { abstract public boolean hasEdge(int p, int q); abstract public Set neighboursOf(int p); abstract public void addEdge(int p, int q); public List depthFirstTraversal(int root) { List visited = new LinkedList<>(); LinkedList notVisited = new LinkedList<>(); notVisited.add(root); while (!notVisited.isEmpty()) { int p = notVisited.pop(); visited.add(p); Set neighbours = neighboursOf(p); for (int q : neighbours) if (!visited.contains(q) && !notVisited.contains(q)) notVisited.push(q); } return visited; } }