GrapheOriente
suivante.
class GrapheOriente { ListeDeSommets sommets; GrapheOriente() { sommets=null; } Sommet ajouteSommet() {...} void initialiseVisite() {...} } class Sommet { String etiquette; int travail; boolean visite; ListeDeSommet succ; Sommet(String e) {...} void nouveauSuccesseur(Sommet s) {...} } class ListeDeSommets { Sommet contenu; ListeDeSommets suivant; boolean visite; ListeDeSommets(Sommet s,ListeDeSommets adj) {...} }Le constructeur de la classe
GrapheOriente
crée un graphe
vide qui contient des objets de type Sommet
.
Une méthode d'instance de la classe GrapheOriente
permet
d'ajouter un nouveau sommet, en précisant son étiquette.
Chaque sommet est composé d'une étiquette (son nom), d'un
champs de travail de type int
, d'un booléen
visite
utile pour visiter l'algorithme, et d'une liste de
successeurs.
Une méthode d'instance initialiseVisite
de la classe
GrapheOriente
permet de mettre à false
tous
les champs visite
.
Les listes de sommets sont implémentées par la classe
ListeDeSommet
qui s'utilise comme une classe Liste
habituelle avec un champs contenu
et un champs
suivant
.
Si l'on a un objet g
de classe GrapheOriente
, on a
donc accès à
g.sommets
g.ajouteSommet
qui retournent un nouveau
sommet
g.initialiseVisite
u
et v
, on peut
également ajouter une nouvelle arête de u
vers
v
par u.nouveauSuccesseur(v)
.
Afin de faire une application Java qui permet de définir un graphe
orienté et de faire un traitement dessus, on utilise l'interface
GrapheOrienteEditeur
.
Pour cela, télécharger le fichier
GrapheOrienteEditeur.java
(en cliquant ici), puis le compiler.
Le programme d'application peut alors se trouver dans un fichier
séparé dans une classe GrapheOrienteApplication
.
L'éditeur de graphe lance le constructeur de cette classe.
Le programme ressemble donc à ceci.
class GrapheOrienteApplication { GrapheOrienteApplication(GrapheOriente g) { ... } }
Faire une méthode
void parcoursEnProfondeur(GrapheOriente g)
Définir une méthode qui détermine si un tel ordonnancement est possible.
Définir un algorithme qui affiche un ordre possible des tâches
qui respecte toutes les contraintes lorsque l'ordonnancement est possible.
[corrigé]
class Graphe { ListeDeSommets sommets; Graphe() { sommets=null; } Sommet ajouteSommet() {...} void initialiseVisite() {...} } class Sommet { String etiquette; int travail; boolean visite; ListeDeSommet voisin; Sommet(String e) {...} void nouveauVoisin(Sommet s) {...} } class ListeDeSommets { Sommet contenu; ListeDeSommets suivant; boolean visite; ListeDeSommets(Sommet s,Liste adj) {...} }On utilise de même l'interface
GrapheEditeur
.
Pour cela, télécharger le fichier
GrapheEditeur.java
(en cliquant ici)
Les applications sont définies dans la classe
GrapheApplication
.
On dit qu'un graphe est bipartie si l'on peut faire une partition de l'ensemble de ses sommets en deux parties et telle qu'il n'existe pas d'arête reliant deux sommets d'une même classe. Faire une méthode
boolean estBipartie(GrapheOriente g)
Etant donné un graphe connexe, à quelle condition
nécessaire et suffisante existe-t-il un circuit Eulérien?
ecrire une méthode qui affiche affiche un tel circuit s'il existe.
[corrigé]