Per ora ho scritto questo:

codice:
import java.util.*;
class Vertex
{
    private int element;
    private List<Edge> archiEntranti;
    private List<Edge> archiUscenti;
    private boolean explored;
    public Vertex(int e)
    {
        this.element = e;
        this.explored = false;
        this.archiEntranti = new LinkedList<Edge>();
        this.archiUscenti = new LinkedList<Edge>();
    }
    public void setExplored()
    {
        this.explored = true;
    }
    public void setElem(int e)
    {
        this.element = e;
    }
    public boolean isExplored()
    {
        return this.explored == true;
    }
    public int getElem()
    {
        return this.element;
    }
    public List<Edge> getArchiUscenti()
    {
        return this.archiUscenti;
    }
    public List<Edge> getArchiEntranti()
    {
        return this.archiEntranti;
    }
}
class Edge
{
    private Vertex origine;
    private Vertex destinazione;
    private boolean discovery;
    private boolean back;
    private boolean forward;
    private boolean cross;
    public Edge()
    {
        this.discovery = false;
        this.back = false;
        this.forward = false;
        this.cross = false;
    }
    public void setDiscovery()
    {
        this.discovery = true;
    }
    public void setBack()
    {
        this.back = true;
    }
    public void setForward()
    {
        this.forward = true;
    }
    public void setCross()
    {
        this.cross = true;
    }
    public boolean isDiscovery()
    {
        return this.discovery == true;
    }
    public boolean isBack()
    {
        return this.back == true;
    }
    public boolean isForward()
    {
        return this.forward == true;
    }
    public boolean isCross()
    {
        return this.cross == true;
    }
    public Vertex getOrigine()
    {
        return this.origine;
    }
    public Vertex getDestinazione()
    {
        return this.destinazione;
    }
    public void setOrigine(Vertex v)
    {
        this.origine = v;
    }
    public void setDestinazione(Vertex v)
    {
        this.destinazione = v;
    }
}
public class SccGraphSolver extends SccGraph
{
    private List<Edge> listaArchi;
    private List<Vertex> listaVertici;

    public SccGraphSolver()
    {
        this.listaArchi = new LinkedList<Edge>();
        this.listaVertici = new ArrayList<Vertex>();
    }
    public void aggiungiArcoOrientato(int verticeSorgente, int verticeDestinazione)
    {
        for(int i=0; i<this.listaArchi.size(); i++)
        {
            Edge curr = listaArchi.get(i);
            if((curr.getOrigine().getElem()==verticeSorgente) && (curr.getDestinazione().getElem()==verticeDestinazione))
            {
                return;
            }
        }
        Edge nuovo = new Edge();
        Vertex origine = new Vertex(verticeSorgente);
        Vertex destinazione = new Vertex(verticeDestinazione);
        nuovo.setOrigine(origine);
        nuovo.setDestinazione(destinazione);
        this.listaArchi.add(nuovo);
    }
    public void aggiungiVertice(int vertice)
    {
        for(int i=0; i<this.listaVertici.size(); i++)
        {
            Vertex curr = listaVertici.get(i);
            if(curr.getElem()==vertice)
            {
                return;
            }
        }
        Vertex nuovo = new Vertex(vertice);
        this.listaVertici.add(nuovo);
    }
    public Set<Integer> calcolaComponenteFortementeConnessa(int vertice)
    {
        return null;
    }
    public int calcolaSommaRaggiungibilita(int vertice)
    {
        int ris = 0;
        Vertex input = find(vertice);
        ris = calcolaSommaRaggiungibilita(ris,input);
        return ris;
    }
    private int calcolaSommaRaggiungibilita(int ris, Vertex input)
    {
        ris += input.getElem();
        input.setExplored();
        for(Edge x : input.getArchiUscenti())
        {
            Vertex w = x.getDestinazione();
            if(!w.isExplored())
            {
                ris += calcolaSommaRaggiungibilita(ris,w);
            }
        }
        return ris;
    }
    private Vertex find(int vertice)
    {
        for(int i=0; i<this.listaVertici.size(); i++)
        {
            Vertex curr = listaVertici.get(i);
            if(curr.getElem()==vertice)
            {
                return curr;
            }
        }
        return null;
    }
}