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;
}
}