---
lang: fr
tags: theorie des graphs, S6, ING1
title: Theorie des graphs 3
date: 01/03/2019
---
# Theorie des graphs 3
++Probleme:++ Connaitre le nombre de possibilité pour un algo qui résoud un rubik's cube:
A chaque fois on a 12 possibilités de rotations car pour chaque face on a 2 rotations possibles (left/right) et il y a 6 faces.
```graphviz
digraph G {
rankdir = LR
init->{1,2,3,"...",12}
1->{_1,_2,_3, "....", _12}
}
```
Donc quel le nombre minimal de rotation nécessaire pour résoudre n'importe quel rubik's cube ?
++Spoiler++: Il en faut 26. Donc 26 steps dans l'arbre. (12 si on autorise les demi tours)
Si on considère "left" l'operation tourner a gauche et "right" l'op tourner a droite, on se retrouve avec des états communs.
Par exemple: left, left = right right
Du coup pour analyser ça, on va utiliser un parcour largeur.
### Parcours largeur (breadth first search)
<img src="https://docs.google.com/drawings/d/e/2PACX-1vRsewHBHdIUxUlo2mm-Z-R-GfW1U-ud-Qz5V1emzkxGrUo3o_MONZ0-hipkr1-JOCWdTy1p7z91SwmQ/pub?w=960&h=720">
Dans ce cas là, on part de S.
- enqueue(1,2)
- Dequeue 1
- Enqueue 3,4
- dequeue 2
- On a déjà enqueue 1,4
- dequeue 3
- on a déjà enqueue 4, mais pas 5 donc enqueue 5.
- ainsi de suite
```python=
# On suppose qu'on est en list d'adjacence (tableau de tableau quoi)
adj = [[1,2][]0,2,3,4][0,1,4]] # Pas complet mais on devine la suite
def BFS(adj, s):
queue = [s] # teta(1)
seen = [False] * len(adj) # teta(1)
seen[s] = True # teta (1)
while queue: # O(|V|)
x = queue.pop(0)
for y in adj[x]: # Sigma deg(x) = 2 |E| = teta(|E|). Donc O(|E|)
if not seen[y]: # O(|E|)
seen[y] = True # O(|v|)
queue.append(y) # O(|v|)
# = O(|V| + |E|)
```
Si le graph est connexe, on a du téta à la place des O.
### Propriété des graphs
:warning: Au partiel
exc(x) = max (dist(x,y))
rayon(G) = min (exec(x))
diametre(G) = max (exc(x))
++Version avec l'excentricité++:
```python=
# On suppose qu'on est en list d'adjacence (tableau de tableau quoi)
adj = [[1,2][]0,2,3,4][0,1,4]] # Pas complet mais on devine la suite
def BFS(adj, s):
queue = [s] # teta(1)
seen = [False] * len(adj) # teta(1)
seen[s] = True # teta (1)
dist = [0] * len(adj)
while queue: # O(|V|)
x = queue.pop(0)
for y in adj[x]:
if not seen[y]: # O(|E|)
seen[y] = True # O(|v|)
queue.append(y) # O(|v|)
dist[y] = dist[x]
return max(dist)
```
++BFS par vagues++:
```python=
def exc(adj, s):
seen = [False] * len(adj)
seen[s] = True
cur_level = [s]
next_level = []
depth = 0
while cur_level:
for x in cur_level:
for y in adj[x]:
if not seen[y]:
seen[y] = True
next_level.append(y)
cur_level = next_level
next_level = []
depth += 1
return depth - 1
```