b.get
on retire deux éléments du sac à chaque itération.vu[s]
).
Puis divisons vraiment en trois, non-vus N,
dans le sac (et donc forcément vus) S, et visités V.while
termine (car la boucle
for
termine) et se solde par l'ajout d'exactement un élément
à V.
Le programme termine donc, car V ne peut croître indéfiniment.while
, car le sac est alors vide.
while
s'exécute V
fois (c'est la preuve de terminaison).
Reste à majorer le nombre d'itérations de la boucle for
.
On procède globalement.
Pour un sommet donné (une itération donnée de la boucle
while
), tous les voisins sont examinés une fois.
Chaque arc est donc examiné deux fois.vu
un tableau
d'entiers destiné à enregistrer les numéros de composante connexe.
private static void xcc(int s, Bag b,int [] cc, int ncc) { b.add(s) ; cc[s] = ncc ; while (!b.isEmpty()) { int n = b.get() ; System.out.print(" " + n) ; for (List p = succ[n] ; p != null ; p = p.next) if (cc[p.val] == 0) { b.add(p.val) ; cc[p.val] = ncc ; } } System.out.println() ; } static void findCC(Bag b) { int [] cc = new int[succ.length] ; int ncc = 1 ; for (int s = 0 ; s < succ.length ; s++) if (cc[s] == 0) { xcc(s,b,cc,ncc) ; ncc++ ; } } |