// Cette class represente une ville avec des routes qui rejoignent d'autres villes
class Ville
{
protected String nom;
protected ArrayList routes=new ArrayList();
protected boolean dejaParcouru;
public String toString()
{
return nom;
}
// Verifier (recursivement) si la ville v
// est joignable a partir de cette ville
public boolean EstJoignable(Ville v)
{
boolean aRetourner ;
if (dejaParcouru)
{
// Si on a deja parcouru cette ville, sans succes, inutile de recommencer
System.out.println("Je suis a la ville : " + this + ", deja parcourue !") ;
aRetourner = false;
}
else
{
System.out.println("Je suis a la ville:"+ this +
", a la recherche de la ville:"+v);
if(v == this)
{
// On est dessus, on a trouvé!
aRetourner = true ;
}
else
{
// Marquer qu'on est en trai de parcourir cette ville
dejaParcouru=true;
// regarder dans toutes les villes voisines
// Pour ca, on va regarder chaque route
int i = 0 ;
aRetourner = false ;
while (!aRetourner && i < routes.size())
{
Route r=(Route)routes.get(i);
System.out.println("De " + this + ", je parcours la route:" + r);
// pour chaque route, trouver la ville d'en face
Ville vr = r.Autre(this);
// Regarder si la ville "v" peut etre jointe
// a partir de l'autre ville
aRetourner = vr.EstJoignable(v) ;
i++ ;
}
// on libère le marqueur "dejaParcouru" :
dejaParcouru = false ;
}
}
return aRetourner ;
}
// Ajouter une route
public void AjouterRoute(Route route)
{
routes.add(route);
}
// Constrcteur
public Ville(String _nom)
{
nom=_nom;
dejaParcouru = false ;
System.out.println("Creation de la ville:"+nom);
}
}
// Cette classe represente une route qui relie 2 villes
class Route
{
protected String nom;
protected Ville ville1;
protected Ville ville2;
public String toString(){return nom+"("+ville1+","+ville2+")";}
// Retourne l'une des deux villes qui n'est pas "v"
public Ville Autre(Ville v)
{
if(v!=ville1){return ville1;}
else
{return ville2;}
}
public Route(String _nom,Ville _ville1,Ville _ville2)
{
nom=_nom;
ville1=_ville1;
ville2=_ville2;
ville1.AjouterRoute(this);
ville2.AjouterRoute(this);
}
}