--- title: Théorie des graphes date: 01/03/19 author: Robin 'Pachichi' Boucher tags: cours, theorie des graphes, graphes --- > 01/03/19 # Théorie des graphes Nb de coups minimum pour résoudre n'importe quelle configuration minimum d'un Rubik's Cube: [20](http://cube20.org/) Use a Breadth First Search (BFS) to compute the number above. ```graphviz graph graphname { rankdir=LR; s -- { a b } a -- { b c d } b -- { c g } c -- { d g e } d -- e e -- f f -- g } ``` On part du sommet **s** et on applique l'algo suivant: ```python adj=[{a,b}, {s,b,c,d}, {s,a,c,g}, ...] #liste d'adjacence def BFS(adj, s): queue = [s] seen = {s} while queue: # x = queue.pop(0) for y in adj[x]: if (y not in seen): seen.add(y) queue.append(y) # si graphe connexe: |V| = O(E) ``` ==excentricité d'un sommet s:== plus grande distance qu'on peut parcourir à partir de s ```graphviz graph excentricite { rankdir=LR 1 -- { 2, 3} #exc(1) = 2 2 -- {1, 4} # exc(2) = 3 3 -- {4, 5} # exc(3) = 2 4 # exc(4) = 2 5 # exc(5) = 3 } ``` ==rayon d'un graphe:== plus petite excentricité d'un graphe Le rayon du graphe ci-dessus est 2. ==diamètre d'un graphe:== plus grande excentricité d'un graphe. Le diamètre du graphe ci-dessus est 3. ```python #fonction pour calculer l'excentricité def exc(adj, s): cur_level = [s] nxt_level = [] seen = [False] * len(adj) seen[s] = True depth = 0 while cur_level: for x in cur_level: for y in adj[x]: if (not seen[y]): nxt_level.append(y) seen[y] = True cur_level = nxt_level nxt_level = [] depth += 1 return depth - 1 ```