class Graphe:
#crée un graphe avec un certain nombre de sommets, et pas d'arcs. Les sommets sont numérotés de 0 à nbSommets - 1
def __init__(self, nbSommets):
self.listeAdjacences = [ [] for i in range(nbSommets) ]
#entrée : depart et arrive, des entiers entre 0 et n-1, où n = nb de sommets
#ajoute un arc entre depart et arrive.
def ajouterArc(self, depart, arrive):
self.listeAdjacences[depart].append(arrive)
#retourne les successeurs de depart
def getSuccesseurs(self, depart):
return self.listeAdjacences[depart]
#retourne le nombre de sommets
def getNbSommets(self):
return len(self.listeAdjacences)
G = Graphe(5)
G.ajouterArc(0, 3)
G.ajouterArc(0, 1)
G.ajouterArc(1, 2)
G.getSuccesseurs(0)
#même interface que Graphe
class GrapheMatrice:
def __init__(self, nbSommets):
self.matrice = [ [0 for i in range(nbSommets)] for j in range(nbSommets) ]
def ajouterArc(self, depart, arrive):
self.matrice[depart][arrive] = 1
def getSuccesseurs(self, depart):
for j in range(len(self.matrice[depart])):
if self.matrice[depart][j] > 0:
yield j
def getNbSommets(self):
return len(self.matrice)
G2 = GrapheMatrice(5)
G2.ajouterArc(0, 3)
G2.ajouterArc(0, 1)
G2.ajouterArc(1, 2)
G2.matrice
class File:
#crée une file vide
def __init__(self):
self.tableau = []
def enfiler(self, element):
self.tableau.append(element)
def defiler(self):
return self.tableau.pop(0)
def estVide(self):
return len(self.tableau) == 0
f = File()
f.enfiler(2)
f.enfiler(5)
f.defiler()
import math
#effectue le parcours en largeur dans le graphe G, depuis le sommet s
#retourne le tableau des distances
def parcoursLargeur(G, s):
d = [math.inf for i in range(G.getNbSommets())]
d[s] = 0
f = File()
f.enfiler(s)
while not f.estVide():
u = f.defiler()
for v in G.getSuccesseurs(u):
if d[v] == math.inf:
d[v] = d[u] + 1
f.enfiler(v)
return d
parcoursLargeur(G, 0)
#Attention : ne surtout pas écrire un programme abscons qui dépend trop de l'implémentation.
import math
def parcoursLargeur(G, s):
d = [math.inf for i in range(G.getNbSommets())]
d[s] = 0
f = []
f.append(s) #celui qui lit ne comprend pas que f a un comportement de file
while not len(f) == 0:
u = f.pop(0)
for v in len(G.matrice[u]):
if(G.matrice[u][v] == 1) #que signifie cette matrice ?
if d[v] == math.inf:
d[v] = d[u] + 1
f.append(v)
return d