import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;

/**
 * Realizza la visita in profondita' e la visita in ampiezza
 * @author sandrof
 *
 */
public class Visite {

	public static void main(String[] args) {
	    Arco a = new Arco();
	    Grafo g = new Grafo();
	    g.add("a","b",new Integer(1));
	    g.add("b","c",new Integer(1));
	    g.add("b","d",new Integer(3));
	    g.add("c","d",new Integer(4));
	    g.add("d","f",new Integer(2));
	    g.add("d","e",new Integer(4));
	    g.add("h","k",new Integer(4));
	    

	    System.out.println("Il grafo G e':\n" + g);
	    System.out.println("L'insieme di archi e': " + g.getEdgeSet());
	    
	    System.out.println("visita in profondita'");
	    visitaDFS(g,"b");

	    System.out.println("visita in ampiezza");
	    visitaBFS(g,"b");
	    
	}
	
	/**
	 * Visita il grafo g in ampieza partendo dal nodo startingNode,
	 * visita anche componenti non connesse del grafo 
	 * 
	 * @param g grafo da visitare
	 * @param startingNode nodo da cui iniziare la visita
	 */
	private static void visitaBFS(Grafo g, Object startingNode) {
		System.out.println("metodo da implementare");
	}

	/**
	 * Visita il grafo g in profondita' iniziando dal nodo startingNode,
	 * visita anche componenti non connesse del grafo
	 * 
	 * @param g grafo da visitare
	 * @param startingNode nodo da cui inizia la visita
	 */
	private static void visitaDFS(Grafo g, Object startingNode) {
		Set<Object> nodes = new HashSet<Object>(g.getNodeSet());
		Object node = startingNode;
		dfs(g,node,nodes);
		while(!nodes.isEmpty()){
			node = nodes.iterator().next();
			dfs(g,node,nodes);
		}
	}

	/**
	 * Esegue una visita ricorsiva del grafo g partendo dal nodo next 
	 * ed utilizzando come marcatura nodes
	 * 
	 * @param g grafo da visitare
	 * @param next nodo da cui iniziare la visita ricorsiva
	 * @param nodes marcatura
	 */
	private static void dfs(Grafo g, Object next, Set<Object> nodes) {
		System.out.println("metodo da implementare");
	}

	/**
	 * visita il nodo node, la visita esegue la stampa del nodo
	 * 
	 * @param node nodo da visitare
	 */
	private static void visit(Object node) {
		System.out.println(node);
	}
}
