C'est parti !
J'ai repris le schéma de mon réseau que je joins ici : les aiguilles ne changent pas de numéro (a0 à a20), par contre les zones z0 à z41 changent de nom VOIE_0 à VOIE_30. Certaines de ces VOIES sont déclarées en VOIE_GARAGE avec le numéro indiqué sur le schéma.

On voit que j'en ai perdu au passage : toutes les zones contenant une ou plusieurs aiguilles ne sont plus déclarées car remplacées par les aiguilles AIGUILLE_0 à AIGUILLE_20.
Ce qui me donne les identifiants suivants pour tout le réseau :
/*
Indentifiants du reseau
*/
enum {
/* voies */
VOIE_0,
VOIE_1,
VOIE_2,
VOIE_3,
VOIE_4,
VOIE_5,
VOIE_6,
VOIE_7,
VOIE_8,
VOIE_9,
VOIE_GARAGE_10,
VOIE_GARAGE_11,
VOIE_GARAGE_12,
VOIE_GARAGE_13,
VOIE_14,
VOIE_GARAGE_15,
VOIE_16,
VOIE_17,
VOIE_18,
VOIE_19,
VOIE_20,
VOIE_21,
VOIE_22,
VOIE_23,
VOIE_24,
VOIE_25,
VOIE_GARAGE_26,
VOIE_27,
VOIE_28,
VOIE_29,
VOIE_GARAGE_30,
/* aiguille */
AIGUILLE_0,
AIGUILLE_1,
AIGUILLE_2,
AIGUILLE_3,
AIGUILLE_4,
AIGUILLE_5,
AIGUILLE_6,
AIGUILLE_7,
AIGUILLE_8,
AIGUILLE_9,
AIGUILLE_10,
AIGUILLE_11,
AIGUILLE_12,
AIGUILLE_13,
AIGUILLE_14,
AIGUILLE_15,
AIGUILLE_16,
AIGUILLE_17,
AIGUILLE_18,
AIGUILLE_19,
AIGUILLE_20, //52 elements
/* Valeur speciale */
AUCUNE_VOIE
};
Comme les sens de circulation normaux sont indiqués par les flèches, j'ai voulu déclarer les connexions entre les noeuds en suivant le sens de ces flèches.
Comme il y a une circulation interieure dans le sens trigo et une circulation extérieure dans le sens horaire, je tombe sur une petite difficulté pour connecter les aiguilles 0 et 2 à gauche de la gare et 8 et 11 à droite de la gare :
/*
* Connexions des voies
*/
// metro
voieGarage30.connecteAVoie(voie29, ENTRANT);
voie29.connecteSortantAVoie(voie28, ENTRANT);
voie28.connecteSortantAVoie(aiguille15, SORTANT_DROIT);
aiguille15.connecteEntrantAVoie(voie27, ENTRANT);
voie27.connecteSortantAVoie(voieGarage26, SORTANT);
// voie circulaire exterieure
voie4.connecteSortantAVoie(aiguille16, ENTRANT);
aiguille16.connecteSortantDevieAVoie(aiguille15, SORTANT_DEVIE);
aiguille16.connecteSortantDroitAVoie(aiguille13, SORTANT_DEVIE);
voie3.connecteSortantAVoie(aiguille13, SORTANT_DROIT);
aiguille13.connecteEntrantAVoie(voie5, ENTRANT);
voie5.connecteSortantAVoie(voie6, ENTRANT);
voie6.connecteSortantAVoie(voie7, ENTRANT);
voie7.connecteSortantAVoie(voie8, ENTRANT);
voie8.connecteSortantAVoie(voie9, ENTRANT);
voie9.connecteSortantAVoie(aiguille8, SORTANT_DROIT);
aiguille8.connecteEntrantAVoie(aiguille7, ENTRANT);
aiguille7.connecteSortantDroitAVoie(voie0, ENTRANT);
aiguille7.connecteSortantDevieAVoie(aiguille6, SORTANT_DEVIE);
aiguille6.connecteEntrantAVoie(voie1, ENTRANT);
voie0.connecteSortantAVoie(aiguille4, SORTANT_DROIT);
voie1.connecteSortantAVoie(aiguille5, ENTRANT);
aiguille5.connecteSortantDevieAVoie(aiguille4, SORTANT_DEVIE);
aiguille4.connecteEntrantAVoie(aiguille2, ENTRANT);
aiguille2.connecteSortantDroitAVoie(voie2, ENTRANT);
voie2.connecteSortantAVoie(aiguille17, ENTRANT);
aiguille17.connecteSortantDevieAVoie(voie4, ENTRANT);
aiguille17.connecteSortantDroitAVoie(voie3, ENTRANT);
// voie circulaire interieure
voie23.connecteSortantAVoie(aiguille18, SORTANT_DROIT);
voie24.connecteSortantAVoie(aiguille18, SORTANT_DEVIE);
aiguille18.connecteEntrantAVoie(voie25, ENTRANT);
voie25.connecteSortantAVoie(aiguille0, ENTRANT);
aiguille0.connecteSortantDroitAVoie(aiguille1, ENTRANT);
aiguille1.connecteSortantDroitAVoie(voie16, ENTRANT);
aiguille1.connecteSortantDevieAVoie(aiguille3, SORTANT_DEVIE);
voieGarage15.connecteAVoie(aiguille3, SORTANT_DROIT);
aiguille3.connecteEntrantAVoie(voie17, ENTRANT);
voie16.connecteSortantAVoie(aiguille9, SORTANT_DROIT);
voie17.connecteSortantAVoie(aiguille9, SORTANT_DEVIE);
aiguille9.connecteEntrantAVoie(aiguille11, SORTANT_DROIT);
aiguille11.connecteEntrantAVoie(voie18, ENTRANT);
voie18.connecteSortantAVoie(voie19, ENTRANT);
voie19.connecteSortantAVoie(voie20, ENTRANT);
voie20.connecteSortantAVoie(voie21, ENTRANT);
voie21.connecteSortantAVoie(voie22, ENTRANT);
voie22.connecteSortantAVoie(aiguille14, ENTRANT);
aiguille14.connecteSortantDroitAVoie(voie23, ENTRANT);
aiguille14.connecteSortantDevieAVoie(voie24, ENTRANT);
// depot
voieGarage11.connecteAVoie(aiguille12, SORTANT_DROIT);
voieGarage12.connecteAVoie(aiguille12, SORTANT_DEVIE);
voieGarage13.connecteAVoie(aiguille10, SORTANT_DEVIE);
aiguille12.connecteEntrantAVoie(aiguille10, SORTANT_DROIT);
aiguille10.connecteEntrantAVoie(aiguille20, ENTRANT);
aiguille20.connecteSortantDroitAVoie(aiguille6, SORTANT_DROIT);
aiguille20.connecteSortantDevieAVoie(voie14, ENTRANT);
voie14.connecteSortantAVoie(aiguille19, SORTANT_DEVIE);
aiguille5.connecteSortantDroitAVoie(aiguille19, SORTANT_DROIT);
aiguille19.connecteEntrantAVoie(voieGarage10, SORTANT);
// passages voies interieurs <-> exterieures
aiguille0.connecteSortantDevieAVoie(aiguille2, SORTANT_DEVIE);
aiguille8.connecteSortantDevieAVoie(aiguille11, SORTANT_DEVIE);
Au lancement du programme, le moniteur affiche 2 anomalies :
Direction deja fixee : AIGUILLE_2
Direction deja fixee : AIGUILLE_8
Nombre de voies : 52
Peut-être devrais-je déclarer les connexions autrement

En tout cas tous les tests d'itinéraires fonctionnent (je déclare sur le moniteur une voie de départ et une voie d'arrivée et le programme affiche le résultat). exemple :
De VOIE_1 a VOIE_GARAGE_26
VOIE_1 VOIE_2 VOIE_4 VOIE_GARAGE_26 VOIE_27 AIGUILLE_2 AIGUILLE_4 AIGUILLE_5 AIGUILLE_15 AIGUILLE_16 AIGUILLE_17
De VOIE_1 a VOIE_3
VOIE_1 VOIE_2 VOIE_3 AIGUILLE_2 AIGUILLE_4 AIGUILLE_5 AIGUILLE_17