Salve forum. Allora io devo risolvere un problema:

Data la mia matricola (che sta in un array), devo verificare se nel digrafo (grafo diretto) esiste almeno un percorso che
attraversa nell'ordine tutti i vertici (Integer) con etichetta pari alle cifre della matricola.

Esempio:

se la matricola e' 1052001 il metodo restituisce true se esiste un percorso che attraversa esattamente i vertici 1,0,5,2,0,0,1
nello stesso ordine in cui compaiono nella matricola (percorrendo eventualmente piu' volte gli stessi archi del grafo se necessario).

Avevo pensato di calcolare tutti i percorsi possibili partendo dal vertice corrispondente alla cifra più significativa della
matricola (quella più a sinistra) ottenendo una lista di liste. Passare questa lista di liste ad un metodo ausiliario
assieme alla matricola e verificare se in questa lista di liste vi è una lista contenente la stessa identica sequenza
di vertici indicati dalla matricola.

Penso che di dovrebbe specializzare una dfs. Avete qualche idea?

Questo è il codice che ho scritto fino ad ora:

Classe Edge5R

codice:
public final class Edge5R {
    private final int destination;
    private final int source;

    public Edge5R(int source, int destination) {
        this.source = source;
        this.destination = destination;
    }

    @Override
    public String toString() {
        return "(" + source + "->" + destination + ")";
    }

    /**
     * vertice di destinazione
     *
     * @return
     */
    public int getDestination() {
        return destination;
    }

    /**
     * vertice sorgente
     *
     * @return
     */
    public int getSource() {
        return source;
    }
}
Classe che rappresenta il grafo

codice:
import java.util.*;

public class Graph5RImpl implements Graph5R
{
    private HashMap<Integer, List<Edge5R>> graph;

    public Graph5RImpl()
    {
        graph = new HashMap<Integer, List<Edge5R>>();
    }
    
    public boolean containsVertex(int vertex)
    {
        return this.graph.containsKey(vertex);
    }

    public Collection<Edge5R> edges()
    {
        Collection<Edge5R> ris = new ArrayList<Edge5R>();
        Collection<List<Edge5R>> values = graph.values();
        Iterator<List<Edge5R>> it = values.iterator();
        while(it.hasNext())
        {
            List<Edge5R> curr = it.next();
            ris.addAll(curr);
        }
        return ris;
    }

    public Edge5R getEdge(int source, int destination)
    {
        List<Edge5R> e = graph.get(source);
        if(e != null)
        {
            Iterator<Edge5R> it = e.iterator();
            while(it.hasNext())
            {
                Edge5R curr = it.next();
                if(curr.getDestination() == destination)
                {
                    return curr;
                }
            }
        }
        return null;
    }

    public void insertEdge(Edge5R edge)
    {
        int source = edge.getSource();
        int destination = edge.getDestination();
        List<Edge5R> esource = graph.get(source);
        if(esource == null)
        {
            esource = new LinkedList<Edge5R>();
            graph.put(source,esource);
        }
        esource.add(edge);
        List<Edge5R> edestination = graph.get(destination);
        if(edestination == null)
        {
            edestination = new LinkedList<Edge5R>();
            graph.put(destination, edestination);
        }
    }

    public void insertVertex(int v)
    {
        List<Edge5R> e = graph.get(v);
        if(e == null)
        {
            e = new LinkedList<Edge5R>();
            graph.put(v,e);
        }
    }

    public Collection<Edge5R> outEdges(int source)
    {
        List<Edge5R> e = graph.get(source);
        if(e != null)
        {
            return e;
        }
        else
            return new LinkedList<Edge5R>();
    }

    public Collection<Integer> outVertices(int source)
    {
        Collection<Integer> ris = new LinkedList<Integer>();
        List<Edge5R> e = graph.get(source);
        if(e != null)
        {
            Iterator<Edge5R> it = e.iterator();
            while(it.hasNext())
            {
                Edge5R curr = it.next();
                ris.add(curr.getDestination());
            }
            return ris;
        }
        return new LinkedList<Integer>();
    }

    public Collection<Integer> vertices()
    {
        Collection<Integer> ris = new HashSet<Integer>();
        Set<Integer> s = graph.keySet();
        if(s != null)
        {
            Iterator<Integer> it = s.iterator();
            while(it.hasNext())
            {
                Integer curr = it.next();
                ris.add(curr);
                ris.addAll(outVertices(curr));
            }
            return ris;
        }
        return new LinkedList<Integer>();
    }
}
Classe con altri metodi ausiliari di visita e creazione random del grafo

codice:
import java.util.*;

public class HomeworkR5Impl extends HomeworkR5
{
    public Graph5R createEmptyGraph()
    {
        Graph5R graph = new Graph5RImpl();
        return graph;
    }

    public Graph5R createRandomGraph(int n, int m)
    {
        Graph5R ris = new Graph5RImpl();
        for(int i = 0; i < n; i++)
        {
            if(!ris.containsVertex(i))
            {
                ris.insertVertex(i);
            }
        }
        Collection<Integer> vertices = ris.vertices();
        int[] v = new int[vertices.size()];
        int i = 0;
        Iterator<Integer> it = vertices.iterator();
        while(it.hasNext())
        {
            Integer curr = it.next();
            v[i] = curr;
            i++;
        }
        for(int j=0; j<m; j++)
        {
            int source = 0;
            int destination = 0;
            while(source == destination)
            {
                source = extremeRandom(v);
                destination = extremeRandom(v);
            }
            if(ris.getEdge(source, destination)==null)
            {
                Edge5R edge = new Edge5R(source,destination);
                ris.insertEdge(edge);
            }            
        }
        return ris;
    }

    private int extremeRandom(int[] v)
    {
        int dim = v.length;
        int pos = (int)Math.random()*dim;
        return v[pos];
    }

    public boolean existPathMatricola(Graph5R graph)
    {
        //Da completare, MI RIFERISCO A QUESTO METODO
    }

    public int[] matricola()
    {
        int[] ris = {1,2,5,7,2,3,0};
        return ris;
    }

    public Set<Integer> maxHop(Graph5R graph, int source, int maxHops)
    {
        //Da completare
    }
}
Ho omesso le interfacce..

Vi prego non ditermi che devo implementare il Floyd-Warshall ..

Ogni tanto aggiorno il post perché mi viene qualche idea..

Ho pensato che si potrebbe fare una DFS diretta partendo dal vertice S corrispondente dalla cifra della matricola più significativa. Da questo otterrei tutti i vertici raggiungibili da S. Ottenuti i vertici raggiungibili da S vado ad isolarmi i percorsi fra S e i vertici da esso raggiungibili e poi verificare se tra questi percorsi ce n'è uno che segue le cifre della matricola.. help mi sto intrippando un sacco xD