← Retour au menu des cours

Les graphes

Summary

Les corrections des exercices du précédent cours sont disponibles à la fin de la page en question.

Définition

Un graphe est un couple G=(S,A)G = (S, A) où :

Pour un graphe non orienté, une arête est un ensemble ou paire non ordonnée u,v{u, v}.

Pour un graphe orienté, une arête est un couple ordonné (u,v)(u, v) appelé arc.

Vocabulaire

Graphes non orientés

Graphes orientés

Lorsqu'on ignore l'orientation des arcs, on parle de faible conexité.

Cycles et circuits hamiltoniens

Les arrêtes d'un cycle ou d'un circuit sont toutes distinctes. Ce n'est pas forcément le cas des sommets.

Cycle/circuit hamiltonien : Cycle/circuit dans lequel aucun sommet n'est répété 2 fois (à l'exception du premier sommet qui est également le dernier).

Mieux retenir

Image pour mieux retenir

Représentation en python

Matrices d'adjacence

Représentation

Listes des voisins

Liste Voisins

Le parcours de graphe

Le but d’un parcours est d’explorer l’ensemble des sommets accessibles depuis un sommet donné, souvent pour : vérifier la connexité, rechercher un élément, ou calculer des distances.

Algorithme général

def parcours(voisins, s0):
    visites = []
    attente = [s0]

    while attente != []:
        s = attente.pop()
        visites.append(s)

        for v in voisins[s]:
            if v not in visites:
                attente.append(v)

    return visites

Parcours en profondeur avec une pile

Utiliser une pile signifie que .pop() retire le dernier élément ajouté : comportement LIFO (Last In, First Out). Cela donne un parcours en profondeur.

Parcours en largeur avec une file

Utiliser une file signifie que .pop() est remplacé par popleft(), retirant le premier élément ajouté : comportement FIFO (First In, First Out). Cela donne un parcours en largeur.

Parcours récursif naturel = Profondeur

Pour le parcours en profondeur il existe une version récursive qui est plus efficace au niveau de la complexité spaciale :

def parcours(voisins, s, visites = None):
    if visites is None: # Initialisation automatique
        visites = []

    if s in visites:
        return visites

    visites.append(s)

    for v in voisins[s]:
        parcours(voisins, v, visites)

    return visites

Est-ce que tu comprends la notation dans la ligne def parcours(voisins, s, visites = None) ?