12.1. Parcours dans un graphe#

12.1.1. Parcours en profondeur#

def parcours(g, vus, s):
    if s not in vus:
        vus.add(s)
        for v in g.voisins(s):
            parcours(g, vus, v)
def existe_chemin(g, u ,v):
    vus = set()
    parcours(g, vus, u)
    return v in vus

12.1.2. Détection des cycles#

BLANC, GRIS, NOIR = 1, 2, 3

def parcours_cy(g, couleur, s):
    if couleur[s] == GRIS:
        return True
    if couleur[s] == NOIR:
        return False
    couleur[s] = GRIS
    for v in g.voisins(s):
        if parcours_cy(g, couleur, v):
            return True
    couleur[s] = NOIR
    return False
def cycle(g):
    couleur = {}
    for s in g.sommets():
        couleur[s] = BLANC
    for s in g.sommets():
        if parcours_cy(g, couleur, s):
            return True
    return False

12.1.3. Parcours en largeur#

def parcours(g, source):
    dist = {source: 0}
    courant = {source}
    suivant = set()
    while len(courant) > 0:
        s = courant.pop()
        for v in g.voisins(s):
            if v not in dist:
                suivant.add(v)
                dist[v] = dist[s] + 1
        if len(courant) == 0:
            courant, suivant = suivant, set()
    return dist
def distance(g, u, v):
    dist = parcours_largeur(g, u)
    return dist[v] if v in dist else None