public class BreadthFirstTraversal {
    
    public static void traverse(Graph g, int s) {
    	
    	boolean[] visited = new boolean[g.numVertices()];   // algorithm needs to keep track of visited
        QueueArray<Integer> q = new QueueArray<Integer>();  // and routes to explore in the future...
    	
    	System.out.print(s + " ");                // <-- Task 
        
        visited[s] = true;                        // put source in queue and mark it visited
        q.enqueue(s);
        
        while (!q.isEmpty()) {                    // Repeat until queue is empty:
            int v = q.dequeue();                  //    dequeue v from queue
            for (int w : g.adj(v)) {              //    enqueue all unvisited adjacent vertices
                if (!visited[w]) {                //      marking them visited as you do so
                    visited[w] = true;
                    System.out.print(w + " ");    // <-- Task 
                    q.enqueue(w);
                }
            }
        }
    }
    
    public static void main(String[] args) {     
        
        Graph g = new Graph(7);
        g.addEdge(0, 1);
        g.addEdge(0, 6);
        g.addEdge(1, 3);
        g.addEdge(1, 5);
        g.addEdge(1, 6);
        g.addEdge(2, 3);
        g.addEdge(2, 5);
        g.addEdge(2, 6);
        g.addEdge(3, 4);
        g.addEdge(4, 5);

        System.out.println(g);
            
        BreadthFirstTraversal.traverse(g, 0);
    }
}

