Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Problema stampa visita BFS e DFS

    Sto provando a fare la stampa di queste visite in un grafo orientato implementato con liste di adiacenza, ma quando invoco la procedura mi restituisce sempre una stringa vuota, posto i codici con dei commenti, trascurate quelli relativi a cosa non indispensabili per le visite perché l' esercizio voleva altro:

    La coda che mi serve per la BFS

    codice:
    public class Queue
    {
    	private GNode front;
    	private GNode rear;
    	private int size;
    	
    	public Queue()
    	{
    		front=rear=null;
    		
    		size=0;
    	}
    	
    	public GNode getFront(){return front;}
    	public GNode getRear(){return rear;}
    	public int getSize(){return size;}
    	
    	public void enqueue(GNode node)
    	{
    		GNode nuovo=node;
    		if(size==0)
    			front=rear=nuovo;
    		else{
    			rear.setNext(nuovo);
    			rear=nuovo;
    			}
    		size++;
    	}
    	
    	public GNode dequeue()
    	{
    		if(size==0) return null;
    		
    		GNode tmp=getFront();
    		front=tmp.getNext();
    		tmp.setNext(null);
    		size--;
    		
    		return tmp;
    		
    	}
    }

    La lista linkata dove inserirņ i nodi del mio grafo:

    codice:
    public class LinkedList
    {
    	protected int size;
    	protected GNode head;
    	
    	public LinkedList()
    	{
    		head=null;
    		size=0;
    		
    	}
    	
    	public int getSize(){return size;}
    	public GNode getHead(){return head;}
    	public boolean isEmpty(){return (size==0);}
    	public void addFirst(GNode node)        //inserimento in testa
    	{
    		if(isEmpty())
    			head=node;
    		else
    		{			
    			node.setNext(head);
    			head=node;
    		}
    		
    	   size++;
    	}
    }

    La classe GNode del grafo:

    codice:
    public class GNode
    {
    	protected int label;
    	protected Edge adiacent;
    	protected int degree;
    	protected GNode next;
    	protected int color;
    	protected int level;
    	protected GNode parent;          //servirą per la visita BFS
    	
    	public GNode(int label)
    	{
    		this.label=label;
    		adiacent=null;
    		degree=0;
    		next=null;
    		color=0;
    		level=-1;
    		parent=null;
    	}
    	
    	public void setParent(GNode node){parent=node;}
    	public GNode getParent(){return parent;}
    	public int getLevel(){return level;}
    	public void setLevel(int i){level=i;}
    	public int getColor(){return color;}
    	public void setColor(int i){color=i;}
    	public int getLabel(){return label;}
    	public void setLabel(int label){this.label=label;}
    	public int getDegree(){return degree;}
    	public GNode getNext(){return next;}
    	public void setNext(GNode next){this.next=next;}
    	public void addAdiacent(GNode u)
    	{
    		Edge arco=new Edge(this, u);
    		arco.setNext(adiacent);
    		adiacent=arco;
    		degree++;
    	}
    	
    	public Edge getAdiacent(){return adiacent;}
    	
    	public String toString()
    	{
    		String ret="";
    		return ret+=this.getLabel()+" ";
    	}
    	
    }
    La classe arco:

    codice:
    public class Edge
    {
    	private GNode origine;
    	private GNode destinazione;
    	private Edge next;
    	
    	public Edge(GNode origine, GNode destinazione)
    	{
    		this.origine=origine;
    		this.destinazione=destinazione;
    		next=null;
    	}
    	
    	public GNode getOrigine(){return origine;}
    	public GNode getDestinazione(){return destinazione;}
    	public Edge getNext(){return next;}
    	public void setNext(Edge next){this.next=next;}
    	
    }
    E infine la classe Grafo:

    codice:
    public class Grafo
    {
    	protected LinkedList list;
    	protected int node;
    	protected int edges;
    	protected String archi;        //APPOSITAMENTE PER QUESTO CASO
    	protected Queue coda;      //Supporto per BFS
    	protected String dfs="";    //Stamperņ la DFS
    	protected String bfs="";
    	
    	public Grafo()
    	{
    		coda=new Queue();
    		list=new LinkedList();
    		node=0;
    		edges=0;
    		archi="";                //APPOSITAMENTE PER QUESTO CASO
    	}
    	
    	public int node(){return node;}
    	public int edges(){return edges;}
    	
    	public void addEdge (GNode u, GNode v){
    		u.addAdiacent(v);
    		edges++;
    	}
    	
    	public boolean isAdj(GNode u, GNode v)    //verifica se sono adiacenti
    	{
    		Edge arco=u.getAdiacent();
    		
    		while(arco!=null)
    		{
    			if(arco.getDestinazione()==v)
    				return true;
    			arco=arco.getNext();
    		}
    		return false;
    	}
    	
    	public int degree(GNode u){return u.getDegree();}
    		
    	public void addNode(GNode nodo)
    	{
    		list.addFirst(nodo);
    		node++;
    	}
    	
    	public boolean isPresent(GNode nodo)   //verifica se un nodo č contenuto
    	{
    		GNode tmp=list.head;
    		while(tmp!=null)
    		{
    			if(tmp.getLabel()==nodo.getLabel())
    				return true;
    			tmp=tmp.getNext();
    		}
    		
    	  return false;
    	}
    	
    	public void BFSVisit(GNode node)          
    	{
    		GNode nodo=list.head;
    		
    		while(nodo!=null)        //per tutti i nodi del grafo setto questi parametri
    		{
    			nodo.setColor(0);
    			nodo.setLevel(-1);
    			nodo.setParent(null);
    			nodo=nodo.getNext();
    		}
    		
    		node.setLevel(0);             //questo sarą il nodo da cui voglio iniziare la visita e setto cosģ
    		node.setColor(1);
    		node.setParent(null);
    		
    		coda.enqueue(node);                 //inserisco in coda
    		
    		while(coda.getSize()>0){                    //qui tolgo l' elemento
    			GNode s=coda.dequeue();
    			//System.out.println(s.toString());
    			bfs+=s.toString();                     //lo aggiungo alla stringa che mi stamperą la visita
    			Edge arc=s.getAdiacent();         //prendo un arco
    			while(arc!=null){                       //finchč arc non č null ho altri nodi adiacenti
    				GNode dest=arc.getDestinazione();      //prendo il nodo adiacente e lo memorizzo in dest
    				if(dest.getColor()==0)
    				{
    					coda.enqueue(dest);
    					dest.setParent(s);
    					dest.setLevel(s.getLevel()+1);
    					dest.setColor(1);
    				}
    				arc=arc.getNext();    //avanzo per cercare gli altri archi e quindi i nodi adiacenti
    			}
    			    s.setColor(1);
    		}
    	}
    	
    	public void DFS()
    	{
    		GNode nodo=list.head;
    		//Grafo corrente=this;
    		
    		while(nodo!=null)            //per ogni nodo setto di default
    		{
    			nodo.setColor(0);
    			nodo.setParent(null);
    			nodo=nodo.getNext();
    		}
    		
    		GNode nodo1=list.head;
    		
    		while(nodo1!=null)
    		{
    			if(nodo1.getColor()==0)
    				DFSVisit(/*corrente,*/nodo1);
    			
    			nodo1=nodo1.getNext();
    		}
    	}
    	
    	
    	public void DFSVisit(/*Grafo g, */GNode s)
    	{
    		dfs+=s.toString();        //concateno la stringa che conterrą i valori
    		s.setColor(1);
    	
    		Edge arc=s.getAdiacent();
    		while(arc!=null)            //anche qui finchč ho nodi adiacenti se arc non uguale a null
    		{
    			GNode dest=arc.getDestinazione();      //trovo quello adiacente
    			if(dest.getColor()==(0))
    			{
    				dest.setParent(s);
    				DFSVisit(/*g,*/dest);
    			}
    			
    			arc=arc.getNext();         //vado sugli altri archi cioč per cercare nodi adiacenti
    		}
    		s.setColor(2);
    	}
    		
    
    	public String toStringDFS()
    	{
    		return dfs;
    	}
    	
    	public String toStringBFS()
    	{
    		return bfs;
    	}
    }

    Perņ in questo main ottengo due stringhe vuote come stampa:

    codice:
    public class GrafoOrientato
    {
    	public static void main(String []args)
    	{
    		Grafo gr=new Grafo();
    		GNode nodo1=new GNode(10);
    		GNode nodo2=new GNode(20);
    		GNode nodo3=new GNode(30);
    		GNode nodo4=new GNode(40);
    		
    		gr.addNode(nodo1);
    		gr.addNode(nodo2);
    		gr.addNode(nodo3);
    		gr.addNode(nodo4);
    		
    	
    		gr.addEdge(nodo4,nodo3);
    		gr.addEdge(nodo3,nodo2);
    		gr.addEdge(nodo2,nodo1);
    		
    		//System.out.println(gr.list.getHead().toString());
    		System.out.println(gr.toStringBFS());
    		System.out.println(gr.toStringDFS());
    	}
    }

    Come mai mi stampa due stringhe vuote? Ho il sospetto che le chiamate ricorsive sovrascrivino male....come faccio a stampare?

  2. #2
    Nessuno proprio potrebbe dare un' occhiata?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.