pere joue (entre autres) le rôle du tableau
vu. Ses cases étant remplies avec des numéros de sommets
au cours du parcours,
il faut une valeur distincte de tous les numéros de sommets possibles
pour signifier « non-vu ».pere encode un graphe,
pere[i] ==j signifiant un arc entre les sommets i et
j.
C'est initialement l'arbre formé de l'unique sommet s.
Chaque itération de boucle interne introduit un nouveau sommet et un arc de ce
nouveau sommet à un sommet de l'arbre. On ne peut ainsi créer ni
boucle ni partage et tous les sommets sont reliés à la racine.
(Ou mieux, tous les sommets sont reliés à la racine par un unique
chemin sans répétition d'arcs.)

|
static void findPath(int s, int ss) { int [] pere = findSpanningTree(ss,new Lifo ()) ; if (pere[s] < 0) { System.out.println("Pas de chemin de " + s + " à " + ss) ; } else { int j = s ; while (j != ss) { System.out.print(j + " -> ") ; j = pere[j] ; } System.out.println(ss) ; } } |
pere est bien une
arborescence des plus courts chemins au début d'une itération, il en
va de même à la sortie.cur et next.
|
static void bfs(int s) { List cur, next=null ; boolean [] vu = new boolean [succ.length] ; int d = -1 ; cur = new List(s,null) ; vu[s] = true ; while (cur != null) { d++ ; System.out.print(" [" + d + "]") ; for (List p = cur ; p != null ; p = p.next) { System.out.print(" " + p.val) ; for (List q = succ[p.val] ; q != null ; q = q.next) { if (!vu[q.val]) { vu[q.val] = true ; next = new List(q.val,next) ; } } } cur = next ; next = null ; d++ ; } } |
for (List p=...,
la liste cur contient tous les sommets de distance d,
tandis qu'en sortant de cette même boucle la liste next contient
tous les sommets de distance d+1.bfs n'a pas tout à fait le même
comportement que le parcours à l'aide d'une file,
(il y a en quelque sorte inversion des listes de voisins).