On essaye de distinguer les cases vides avec des cases pleines avec des valeurs spéciales (ex : -1).
Il a le ==suivant logique== et le ==suivant spacial== (le suivant logique est le suivant dans la liste, le suivant spacial est le suivant dans le tableau).
**Ajout possible** : On peut rajouter une pile qui contient les cases libres du tableau.
## Quand utiliser les listes
On utilise les listes pour représenter les ensembles car on ne connaît pas d'avance la taille de ses ensembles.
- Chaque sommet a une couleur : blanc, gris ou noir
Avec l'algo $PP$ on a au moins 4 opérations
- Connaître la couleur d'un sommet
- Modifier la couleur d'un sommet
- Créer un graphe
- Connaître l'ensemble des voisins d'un sommet
- Accéder à un sommet
On modifie le programme comme suit :
```ruby
PP(G:graphe,r: sommet,T:graphe){
colorierengris
Pourchaquevoisinblanc:vderFaire{
ajouteràE(T)lapair(r,v)
PP(G,v)
}
colorierennoir
}
```
On doit rajouter les opérations suivantes :
- Ajouter une arête
| Opération | Complexité |
| --- | --- |
| 1. Tableau de taille n : les indices représentant les sommets et les valeurs les couleurs | Un tableau de taille $n$ (indices représentant les sommets) et chaque case contient 2 champs : La couleur, une liste contenant la liste des voisins |
| Matrice booléenne de taille $n\times n $ : case $(i,j)=1 \leftrightarrow (i,j)$ est une arrête | |
- Parcourir la ligne $i$ de la matrice d'adjacence
- Si la case est à 1, alors $i$ est un voisin de $j$ (ajouter $j$ dans un ensemble)
```ruby
Pourjde0àn-1Faire{
Simat[i][j]=1Alors{
Ajouterjàlalistedesvoisinsdei
}
}
```
==Complexité== : $O(\text{nombre de voisins de }i \times \text{ complexité d'ajout dans }L) + O(n-\text{ nombre de voisins})$
- Suivant le type de $L$,
- $L$ est une pile avec empiler en $O(1)$ et dépiler en $O(1)$
- $O(\text{nombre de voisins de }i \times 1) + O(n-\text{ nombre de voisins}) = O(n)$
- $L$ est un file avec enfiler en $O(1)$ et défiler en $O(1)$
- $O(\text{nombre de voisins de }i \times 1) + O(n-\text{ nombre de voisins}) = O(n)$
- Si $M$ est une liste avec insertion début en $O(1)$, pareil que pile / file si on insère au début
- Si $L$ est liste et on fait une inseertion en fin, qui a une compleité en temps $O(m)$.
- SI $L$ est une liste et on fait une insertion en fin qui a une complexité en temps $O(m)$ :
$$\sum_{j \text{ pas de voisin de }i}O(1) + \sum_{j \leq j \leq \text{nombre de voisins}}O(j) = O(n - \text{nombre de voisins} + \text{nombre de voisins}^2)$$
### Matrice d'incidence
- Ajouter une arête : $(i,j)$
- Ajouter à la ligne $T[i]$ la valeur $j$ :
- $O(1)$ si au début
- $O(n)$ si à la fin
- La complexité dépend de la fonction d'ajout
- Connaître l'ensemble des voisins de $i$ :
- retourner la ligne $T[i]$
- On estime la complexité de $PP$
### Complexité de `PP(G, r, T)`
#### Trace srur un exemple
```dot
digraph{
rankdir=LR;
a->b;
b->c;
c->d;
c->e;
d->e;
e->f;
f->g;
g->d;
f->c;
c->h;
d->f;
}
```
Supposons `r = c`.
- $T = (\{c,d\}, \{c\rightarrow d\}), c \text{ colorié gris}$
```dot
digraph{
rankdir=LR;
// On colorie l'arrête qu'on explore en rouge, les autres en noir