60
Module 4 : Parcours dans un graphe

Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

Embed Size (px)

Citation preview

Page 1: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

Module 4 : Parcours dans un graphe

Page 2: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 2

Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche de cycles Tri topologique Bi-coloriage d’un graphe

Page 3: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 3

Parcours en profondeur Utilise l’idée du backtracking Recherche exhaustive de toutes les

possibilités si possible Retour en arrière (backtrack) s’il n’y a

plus de possibilité d’avancement non explorée

Page 4: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 4

Parcours en profondeur1. Marquer tous les nœuds comme « non

visités »2. Choisir le nœud de départ et le marquer

comme visité3. À partir de là, effectuer un chemin vers le

bas aussi long que possible en ne traitant que les nœuds non encore « visités » (parcours récursif)

4. Si tous les nœuds ne sont pas encore « visités », choisir un autre nœud « non visité » et recommencer à 3.

Page 5: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 5

Parcours en profondeur

1/

u v w

x y z

Page 6: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 6

Exemple (DFS)

1/ 2/

u v w

x y z

Page 7: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 7

Exemple (DFS)

1/

3/

2/

u v w

x y z

Page 8: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 8

Exemple (DFS)

1/

4/ 3/

2/

u v w

x y z

Page 9: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 9

Exemple (DFS)

1/

4/ 3/

2/

u v w

x y z

Page 10: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 10

Exemple (DFS)

1/

4/5 3/

2/

u v w

x y z

Page 11: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 11

Exemple (DFS)

1/

4/5 3/6

2/

u v w

x y z

Page 12: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 12

Exemple (DFS)

1/

4/5 3/6

2/7

u v w

x y z

Page 13: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 13

Exemple (DFS)

1/

4/5 3/6

2/7

u v w

x y z

Page 14: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 14

Exemple (DFS)

1/8

4/5 3/6

2/7

u v w

x y z

Page 15: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 15

Exemple (DFS)

1/8

4/5 3/6

2/7 9/

u v w

x y z

Page 16: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 16

Exemple (DFS)

1/8

4/5 3/6

2/7 9/

u v w

x y z

Page 17: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 17

Exemple (DFS)

1/8

4/5 3/6 10/

2/7 9/

u v w

x y z

Page 18: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 18

Exemple (DFS)

1/8

4/5 3/6 10/

2/7 9/

u v w

x y z

Page 19: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 19

Exemple (DFS)

1/8

4/5 3/6 10/11

2/7 9/

u v w

x y z

Page 20: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 20

Exemple (DFS)

1/8

4/5 3/6 10/11

2/7 9/12

u v w

x y z

Page 21: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 21

Parcours en profondeur PROCEDURE dfs(VAR g : graph; v : integer); BEGIN IF NOT finished THEN BEGIN discovered[v] := true; process_vertex(v); FOR i := 0 TO g.degree[v]-1 DO BEGIN y := g.edges[v][i]; IF NOT discovered[y] THEN BEGIN dfs(g,y) END ELSE IF NOT processed[y] THEN process_edge(v,y); IF finished THEN exit END; processed[v] := true END END;

Extrait partiel du programme Pascal

Page 22: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 22

Parcours en largeur

1. Marquer tous les nœuds comme « non visités »2. Choisir un nœud v de départ et le marquer « visité »3. À partir de v:

a) Visiter tous les nœuds non encore visités adjacents à vb) Visiter tous les nœuds accessibles depuis v en suivant 2 arêtesc) Visiter tous les nœuds accessibles depuis v en suivant n arêtesEn utilisant une file !

4. Si tous les nœuds n’ont pas encore été visités, choisir un nœud non encore visité et recommencer à 3.

Page 23: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 23

Parcours en largeur Placer le nœud de départ dans la file Tant que la file n’est pas vide

soit n le premier nœud de la filetraiter nenlever n de la fileplacer tous les nœuds adjacents à n et non encore traités dans la file

Fin tant que

Page 24: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 24

Parcours en largeur Une file est une structure de données

de type FIFO (First In First Out) Enqueue(x,q) insère l’item x à la fin de q Dequeue(q) renvoie et enlève l’item en tête

de la file Empty(q) indique si la file est pleine, ne

peut plus accepter d’ajouts Initialize_queue(q) crée une file vide

Page 25: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 25

Parcours en largeur

0

r s t u

v w x y

Q: s 0

Page 26: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 26

Exemple (BFS)

1 0

1

r s t u

v w x y

Q: w r 1 1

Page 27: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 27

Exemple (BFS)

1 0

1 2

2

r s t u

v w x y

Q: r t x 1 2 2

Page 28: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 28

Exemple (BFS)

1 0

1 2

2

2

r s t u

v w x y

Q: t x v 2 2 2

Page 29: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 29

Exemple (BFS)

1 0

1 2

2 3

2

r s t u

v w x y

Q: x v u 2 2 3

Page 30: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 30

Exemple (BFS)

1 0

1 2 3

2 3

2

r s t u

v w x y

Q: v u y 2 3 3

Page 31: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 31

Exemple (BFS)

1 0

1 2 3

2 3

2

r s t u

v w x y

Q: u y 3 3

Page 32: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 32

Exemple (BFS)

1 0

1 2 3

2 3

2

r s t u

v w x y

Q: y 3

Page 33: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 33

Exemple (BFS)

1 0

1 2 3

2 3

2

r s t u

v w x y

Q:

Page 34: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 34

Exemple (BFS)

1 0

1 2 3

2 3

2

r s t u

v w x y

BF Tree

Page 35: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 35

Parcours en largeur PROCEDURE bfs(VAR g : graph; start : integer); VAR q : queue; { queue of vertices to visit } BEGIN FOR i := 0 TO g.nvertices-1 DO BEGIN processed[i] := false; discovered[i] := false; END;

init_queue(q); enqueue(q, start); discovered[start] := true;

WHILE NOT empty(q) DO BEGIN v := dequeue(q); process_vertex(v); processed[v] := true; FOR i := 0 TO g.degree[v]-1 DO BEGIN IF NOT discovered[g.edges[v][i]] THEN BEGIN enqueue(q,g.edges[v][i]); discovered[g.edges[v][i]] := true; END; IF NOT processed[g.edges[v][i]] THEN process_edge(v,g.edges[v][i]) END END END;

Extrait partiel du programme Pascal

Page 36: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 36

DéfinitionsChemin (de longueur n): Une séquence de

nœuds v0, v1, …, vn avec une arête de vi à vi+1 pour chaque 0 <= i < n.

Un chemin est simple si tous les nœuds dans le chemin sont distincts.

Un cycle est un chemin de longueur 1 ou plus reliant un nœud vi à lui même.

Un cycle est simple si le chemin est simple, sauf que les premiers et derniers nœuds sont les même.

Page 37: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 37

Composantes connexes Une composante connexe d’un graphe

non orienté est l’ensemble maximal de nœuds tel qu’il existe un chemin entre toutes les paires de nœuds de cet ensemble

Elles se déterminent par un parcours (ici DFS)

Page 38: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 38

Composantes connexes c := 0; FOR i := 0 TO g.nvertices-1 DO IF NOT discovered[i] THEN BEGIN c := c+1; write('Component ',c,': '); dfs(g,i); writeln END

Page 39: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 39

Recherche de cycles Une arête arrière (u,v) est telle que v

est un père de u dans l’arbre DFS construit pour un graphe.

Toute arête arrière allant de u vers son père v crée un cycle dans le chemin de v à u.

Page 40: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 40

Recherche de cycles PROCEDURE process_edge(x,y : integer); BEGIN IF parent[x] <> y THEN BEGIN write('Cycle from ',y, ' to ', x, ' : '); find_path(y,x); writeln { finished := true} END END

Page 41: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 41

Recherche de cycles PROCEDURE find_path(start, endv : integer); BEGIN IF (start = endv) OR (endv = -1) THEN write(start:3) ELSE BEGIN find_path(start, parent[endv]); write(endv:3) END END;

Page 42: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 42

Tri topologique Le tri topologique d'un graphe orienté

sans circuit est une numérotation des sommets dans laquelle les descendants d'un sommet de numéro k sont nécessairement de numéro supérieur à k.

Page 43: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 43

Topological Sort: DFS

F

C

G A B

D E

H Un ordre topologique: C G B A D E F H8

32

1

7

65

4

Page 44: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 44

Tri topologique Soit le graphe orienté acyclique suivant

Page 45: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 45

Tri topologique La table indique pour chacun des

nœuds (1 à 6) le nombre d’arêtes entrantes (indegree) 1 0

2 1

3 3

4 3

5 2

6 0

Page 46: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 46

Tri topologique

1 0

2 1

3 3

4 3

5 2

6 0

1 6file

Page 47: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 47

Tri topologique La valeur en tête de file est enlevée (ici

1). La valeur indegree de chaque nœud

adjacent au nœud enlevé de la file est décrémentée de 1. Le(s) nœud(s) dont l’indegree passe à 0 sont mis dans la file (ici 2).

Page 48: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 48

Tri topologique

1 0

2 0

3 3

4 2

5 2

6 06 2file

Résultat1

Page 49: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 49

Tri topologique

1 0

2 0

3 2

4 2

5 1

6 02file

Résultat1, 6

Page 50: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 50

Tri topologique

1 0

2 0

3 1

4 1

5 0

6 05file

Résultat1, 6, 2

Page 51: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 51

Tri topologique

1 0

2 0

3 0

4 1

5 0

6 03file

Résultat1, 6, 2, 5

Page 52: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 52

Tri topologique

1 0

2 0

3 0

4 0

5 0

6 04file

Résultat1, 6, 2, 5, 3

Page 53: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 53

Tri topologique

1 0

2 0

3 0

4 0

5 0

6 0file

Résultat1, 6, 2, 5, 3, 4

Page 54: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 54

Tri topologique La file est vide est le résultat du tri

topologique est 1, 6, 2, 5, 3, 4

Page 55: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 55

Tri topologique compute_indegrees(g, indegree); init_queue(zeroin); FOR i := 0 TO g.nvertices-1 DO IF indegree[i]=0 THEN enqueue(zeroin,i);

j := 0; WHILE NOT empty(zeroin) DO BEGIN x := dequeue(zeroin); sorted[j] := x; j := j+1; FOR i := 0 TO g.degree[x]-1 DO BEGIN y := g.edges[x][i]; indegree[y] := indegree[y] - 1; IF indegree[y] = 0 THEN enqueue(zeroin,y) END END;

Extrait partiel du programme Pascal

Page 56: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 56

Bi-coloriage d’un graphe Énoncé:

Réalisez un programme Pascal qui indique s’il est possible de repeindre n gares d’un réseau ferré de manière à ce que deux gares reliées directement ne soient jamais peintes de la même couleur.

On ne dispose que de deux couleurs.

Page 57: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 57

Bi-coloriage d’un graphe In 1976 the ``Four Color Map Theorem" was proven with the

assistance of a computer. This theorem states that every map can be colored using only four colors, in such a way that no region is colored using the same color as a neighbor region. Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:

no node will have an edge to itself. the graph is nondirected. That is, if a node a is said to be

connected to a node b, then you must assume that b is connected to a.

the graph will be strongly connected. That is, there will be at least one path from any node to any other node.

Page 58: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 58

Bi-coloriage d’un graphe Input 

The input consists of several test cases. Each test case starts with a line containing the number n ( 1 < n < 200) of different nodes. The second line contains the number of edges l. After this, l lines will follow, each containing two numbers that specify an edge between the two nodes that they represent. A node in the graph will be labeled using a number a (0≤a<n).

An input with n = 0 will mark the end of the input and is not to be processed.

Output  You have to decide whether the input graph can be

bicolored or not, and print it as shown below.

Page 59: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 59

Bi-coloriage d’un graphe Sample Input 

3 3 0 1 1 2 2 0 9 8 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0

Sample Output  NOT BICOLORABLE. BICOLORABLE.

Page 60: Module 4 : Parcours dans un graphe. 12/7/2006Parcours dans un graphe2 Plan du module Parcours en profondeur Parcours en largeur Composantes connexes Recherche

12/7/2006 Parcours dans un graphe 60

Bi-coloriage d’un graphe Problème 10004 http://online-judge.uva.es/problemset/