Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Steiner tree

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    16

    Steiner tree

    ciao a tutti, ho come progetto universitario di realizzare un programma in java, senza che abbia necessariamente un iterfaccia grafica, che calcoli lo steiner tree di un grafo non orientato.
    Iinnanzitutto tutto premetto che non cerco qualcuno che mi dica come fare tutto il lavoro, vorrei soltanto qualche chiarimento e al massimo qualche consiglio su come fare meglio le strutture di dati che ho preparato o su come svolgere meglio l'algoritmo che ho pensato. Per chi non volesse leggere le strutture che ho postato, in fondo al testo c'è una domanda su un comando che non mi è chiaro a cui penso si possa rispondere brevemente.

    Ringrazio in anticipo chi deciderà di dare un'occhiata.

    L'idea che ho avuto è di calcolare il minimo albero ricoprente del grafo, dopodichè in ogni coppia di nodi collegati dagli archi del mimimo albero ricoprente volevo svolgere calcolo del cammino minimo che tiene conto anche dei nodi esterni al grafo( i nodi di streiner), eseguito questo controllo il risultato dovrebbe essere lo steiner tree.

    Nell'implementazione della struttura dati del grafo ho preparato un'interfaccia


    package mio;
    import liste.*;

    public interface grafo {
    public int numNodi();
    public int numArchi();
    public arco sonoAdiacenti(nodo x, nodo y);// retituisce un arco a=x,y se sono //adiacenti, null altrimenti
    public void cambiaInfoNodo(nodo v, Object e);// sostituisce con " e " il contenuto //informativo del nodo
    public Object cambiaInfoArco(arco a, Object e);// sostituisce con " e " il contenuto //informativo di a
    public nodo aggiungiNodo(Object e); // inserisce un nuovo nodo con contenuto e
    public arco aggiungiArco(nodo x, nodo y,Object e);// inserisce un arco x,y di peso e
    public void rimuoviNodo(nodo v);// cancella il nodo v e tutti gli archi a esso associati
    public void rimuoviArco(arco a);// cancella l'arco a
    public listaDoubling nodiBFS( int indice); // restituisce un elenco dei nodi con visita in //ampiezza
    public listaDoubling nodiDFS( int indice); // restituisce un elenco dei nodi con visita in //profontità
    }

    Dove le classi arco e nodo sono rispettivamente


    package mio;

    public class arco {
    Object peso;
    nodo iniziale;
    nodo finale;
    arco(nodo i, nodo f, Object p){
    iniziale =i;
    finale=f;
    peso=p;

    }
    }

    package mio;

    public class nodo {
    int indice;
    Object elem;

    nodo(Object e, int i){
    elem =e;
    indice=i;
    }
    }

    come sottostruttura pensavo di usare una lista( non quella di java)
    ma questa

    public class lista {

    public record first=null,last=null; // record l'ho implementato in modo da svolgere il //lavoro dei puntatori in c++



    public void stampa(){
    record corrente=first;
    System.out.println(" lista= ");
    while(corrente!=null){
    System.out.println(corrente.elem+"");
    corrente=corrente.succ;
    }
    System.out.println();
    };



    public boolean èVuoto(){
    if (first==null) return true;
    else return false;
    };

    public Object trovaPrimo(){
    if (èVuoto()) return null;
    else
    return first.elem;
    };

    public Object trovaUltimo(){
    if (èVuoto()) return null;
    else return last.elem;
    };

    public void inserisciUltimo(Object el){

    record nuovo=new record (el);
    if (èVuoto()) first=last=nuovo;
    else{
    last.succ=nuovo;
    nuovo.prec=last;
    last=nuovo;
    }
    };

    public void inserisciPrimo(Object el){
    record nuovo=new record(el);
    if (èVuoto()) first=last=nuovo;
    else{
    nuovo.succ=first;
    first.prec=nuovo;
    first=nuovo;
    }
    };


    public Object cancPrimo(){
    if (èVuoto()) return null;
    else{
    Object el=first.elem;
    first=first.succ;
    if (first!=null)first.prec=null;
    else last=null;
    return el;
    }
    };


    public Object cancUltimo(){
    if(èVuoto()) return null;
    else{
    Object el=last.elem;
    last=last.prec;
    if(last!=null) last.succ=null;
    else first=null;
    return el;
    }
    }

    public void canc(record rec){
    if (rec==null) return;
    else{

    if(rec.prec!=null) rec.prec.succ=rec.succ;
    else first=rec.succ;
    if(rec.succ!=null) rec.succ.prec=rec.prec;
    else last=rec.prec;
    }
    }

    public record trovaPrimoRec(){
    if (èVuoto()) return null;
    else return first;
    }

    public record trovaUltRec(){
    if(èVuoto()) return null;
    else return last;
    }


    }

    ho una domanda riguardo la classe "nodo"

    Per verificare quali nodi siano attivi o meno sono indeciso su come fare, ho pensato a una varialbile booleana ma su alcuni esempi del libro di algoritmi ho trovato un comando su una classe nodo che fa lui che non conosco e che non spiega,

    public enum state (Active, canc)

    la classe è:

    public class Nodo{
    public enum STATE {ACTIVE, CANC};

    public int index;
    public Object elem;
    public STATE state;

    public Nodo(int i, Object e){
    index = i;
    elem = e;
    state = STATE.ACTIVE;
    }

    }

    potreste spiegarmi questa variabile enum ?

    scusate se magari ho scritto troppe cose.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il codice fa postato nei tag CODE ed indendato, così chi vuole aiutarti può farlo evitando l'effetto peperoncino agli occhi

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    16
    Originariamente inviato da Patrick Jane
    Il codice fa postato nei tag CODE ed indendato, così chi vuole aiutarti può farlo evitando l'effetto peperoncino agli occhi
    giusto scusa,
    potresti spiegarmi per favore come si fa a usare il tag code, ho provato a cliccare su code nella scrittura del messaggio e ci ho incollato il codice ma poi me lo inseriva malissimo
    grazie in anticipo.

  4. #4
    Originariamente inviato da slevin89
    giusto scusa,
    potresti spiegarmi per favore come si fa a usare il tag code, ho provato a cliccare su code nella scrittura del messaggio e ci ho incollato il codice ma poi me lo inseriva malissimo
    grazie in anticipo.
    Cosi':

    Ed ecco il risultato.

    codice:
    metti il codice qua
      indentandolo
        adeguatamente
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    16
    Buon ferragosto a tutti

    @ mxa grazie

    Ricapitolando devo fare un programma che risolva il problema dello steiner tree.


    per l'implementazione del grafo ho scritto questa interfaccia

    codice:
    public interface Grafo{
    	public Object insertNodo(Object e);//restituisce un riferimento al nodo creato
    	public void insertArco(int head, int tail, Double w);
    	public void deleteNodo(int index);
    	public void deleteArco(int head, int tail);
    	public boolean adiacente(int head, int tail);
    	public ListaCollegata visitaBFS(int index);//restituisce la lista dei nodi in una visita BFS   //a partire dal nodo di indice index	
    	public ListaCollegata visitaDFS(int index);//restituisce la lista dei nodi in una visita DFS    //a partire dal nodo di indice index	
    }
    dove gli oggetti nodo e arco li ho scritti

    codice:
    public class arco {
    	Object peso;
    	nodo iniziale;
    	nodo finale;
    	arco(nodo i, nodo f, Object p){
    		iniziale =i;
    		finale=f;
    		peso=p;
    		
    	}
    }
    
    public class nodo {
    	int indice;
    	Object elem;
    	
    	nodo(Object e, int i){
    		elem =e;
    		indice=i;
    	}
    }
    poi ho in mente di implementare questa interfaccia utilizzando una normale lista ( implementata da me ) per memorizzare i vari nodi e archi che ci sono, ho ritenuto che usando una lista doubling( una lista che non si basa sui puntatori ma su un array ) avrei sprecato solo molta memoria

    il codice della lista è questo

    codice:
    public class lista {
    	
    	public record first=null,last=null;
    
    	
    	
    	public void stampa(){
    		record corrente=first;
    		System.out.println(" lista= ");
    		while(corrente!=null){
    			System.out.println(corrente.elem+"");
    			corrente=corrente.succ;
    		}
    		System.out.println();
    	};
    	
    	
    	
    	public boolean èVuoto(){
    		if (first==null) return true;
    		else return false;
    	};
    	
    	public Object trovaPrimo(){
    		if (èVuoto()) return null;
    		else 
    		return first.elem;
    	};
    	
    	public Object trovaUltimo(){
    		if (èVuoto()) return null;
    		else return last.elem;
    	};
    	
    	public  void inserisciUltimo(Object el){
    		
    		record nuovo=new record (el);
    		if (èVuoto()) first=last=nuovo; 
    		else{
    			last.succ=nuovo;
    			nuovo.prec=last;
    			last=nuovo;
               	}
    	};
    	
    	public void inserisciPrimo(Object el){
    		record nuovo=new record(el);
    		if (èVuoto()) first=last=nuovo;
    		else{
    			nuovo.succ=first;
    			first.prec=nuovo;
    			first=nuovo;
    		}
    	};
    		
    		
    	public Object cancPrimo(){
    		if (èVuoto()) return null;
    		else{
    			Object el=first.elem;
    			first=first.succ;
    		    if (first!=null)first.prec=null;	
    			else last=null;
    			return el;
    		}
    		};
    		
    		
    		public Object cancUltimo(){
    			if(èVuoto()) return null;
    			else{
    				Object el=last.elem;
    				last=last.prec;
    				if(last!=null) last.succ=null;
    				else first=null;
    				return el;
    			}
    		}
    		 
    		 public void canc(record rec){
    		 	if (rec==null) return;
    		 	else{ 
    		 		
    		 	    if(rec.prec!=null)	rec.prec.succ=rec.succ;
    		 	    else first=rec.succ;
    		 		if(rec.succ!=null) rec.succ.prec=rec.prec;
    		 		else last=rec.prec;
    		 	}
    		 }
    		 
    		 public record trovaPrimoRec(){
    		 	if (èVuoto()) return null;
    		 	else return first;
    		 }
    		 
    		 public record trovaUltRec(){
    		 	if(èVuoto()) return null;
    		 	else return last;
    		 }
    		 
    		 
    	   }
    gli oggetti record sono:

    codice:
    public class record {
        
        public Object elem;
        public record succ;
        public record prec;
        
        public record(Object el){
        	elem=el;
        	succ=null;
        	prec=null;
        };
    }

    non conosco questo comando

    enum state (Active, canc)

    potreste spiegarmelo per favore, è utilizzato in questo codice del mio libro

    codice:
    public class Nodo{
    	public enum STATE {ACTIVE, CANC};
    
    	public int index;
    	public Object elem;
    	public STATE state;
    	
    	public Nodo(int i, Object e){
    		index = i;
    		elem = e;
    		state = STATE.ACTIVE;	
    	}
    
    }
    Grazie in anticipo. Stefano
    P.S in settimana non ci sarò appena torno vi aggiorno col continuo del lavoro

  6. #6
    Originariamente inviato da slevin89

    non conosco questo comando

    enum state (Active, canc)

    potreste spiegarmelo per favore, è utilizzato in questo codice del mio libro
    Non e' un comando. E' la definizione di un tipo enum: http://download.oracle.com/javase/tu...vaOO/enum.html
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

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.