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).