4
dm(u)= ∞ ; on pose dm+1(v)=dm(v) pour v6= um+1,dm+1(um+1)=m+1, fm+1=fm.
S’il n’existe pas de tel sommet, l’algorithme s’arrête.
Quand l’algorithme est achevé, on pose alors π=πm+1,d=dm+1,f=fm+1.
Notons que les sommets accessibles depuis le sommet initial usont ceux que l’on
visite jusqu’au moment mtel que um=uet où on calcule πm(u)= ∞ ; si c’est tout ce
dont on a besoin, on peut arrêter l’algorithme là.
L’algorithme construit un arbre de recherche (en fait, une forêt), codé via la fonction
prédécesseur. On définit par récurrence qu’un sommet uest un ancêtre d’un sommet v
si u=vou si va un prédécesseur dont uest un ancêtre.
LEMME 2.3. — Si u est un ancêtre de v, l’intervalle [d(u), f(u)] contient l’intervalle
[d(v), f(v)] ; Si v est un ancêtre de u,... Sinon, les intervalles [d(u), f(u)] et [d(v), f(v)]
sont disjoints.
Démonstration. — Dans l’algorithme, si on a atteint un sommet ven suivant une arête, on ne
peut y revenir qu’en remontant une arête déjà descendue. Ainsi, si on va de uvers v, on ne peut
le faire qu’une fois : on ne peut revenir à uqu’une fois avoir terminé d’explorer les arêtes issues
de v.
LEMME 2.4. — Pour qu’un graphe orienté soit acyclique, il faut et il suffit qu’il n’existe
pas d’arête (u,v)telle que v soit un ancêtre de u.
Démonstration. — Si vest un ancêtre de u, il y a un chemin de vàu. S’il existe une arête de u
àv, le graphe possède donc un cycle. Inversement, considérons un cycle (v1,v2,...,vn,v1) dont
v1soit le premier sommet visité par l’algorithme. Alors, v1est le prédécesseur de v2, etc., donc
v1est un ancêtre de vnet il existe une arête (vn,v1).
LEMME 2.5. — Soit G un graphe orienté ; soit (u0,u1,...,un)un chemin dans G. Si
d(u0)<d(ui)pour tout i ∈{1,...,n}, alors u0est un ancêtre de un.
Remarquons que l’hypothèse signifie que lorsque le sommet u0est découvert, les
autres sommets du chemin sont encore vierges.
Démonstration. — Raisonnons par l’absurde en supposant que u0n’est pas un ancêtre de un
et soit mle plus petit entier de {1,...,n} tel que umne soit pas un descendant de u0. On a
d(u0)6d(um−1)<f(um−1)<f(u0). Comme il y a une arête de um−1vers um,umest décou-
vert avant que um−1soit terminé : d(u0)<d(um)<f(um−1). D’après le lemme 1.3, l’intervalle
[d(um), f(um)] est contenu dans l’intervalle [d(u0), f(u0)] (ils ne sont pas disjoints, donc l’un
est inclus dans l’autre, et la seule inclusion possible est celle-ci), donc u0est un ancêtre de um,
contradiction.
Complexité. De chaque sommet, on explore récursivement toutes les arêtes sor-
tantes. La complexité est donc O(|V| + |E|) lorsque le graphe est représenté par sa liste
d’adjacence.
Multiplication matricielle.
Soit Ala matrice d’adjacence d’un graphe (orienté ou non). On remarque que la ma-
trice Ama pour terme (u,v) le nombre de chemins de longueur exactement mqui sont
d’origine uet de terme v. La matrice (I+A)ma pour terme d’indice (u,v) le nombre de