• Aucun résultat trouvé

Plus courts chemins

N/A
N/A
Protected

Academic year: 2022

Partager "Plus courts chemins"

Copied!
6
0
0

Texte intégral

(1)

.

Inf 431 – Cours 3

Connexit´ e 2

Plus courts chemins

jeanjacqueslevy.net

secr´etariat de l’enseignement:

Catherine Bensoussan cb@lix.polytechnique.fr

Aile 00, LIX, 01 69 33 34 67

www.enseignement.polytechnique.fr/informatique/IF

.

Plan

1. Composantes fortement connexes – Tarjan 2. Fermeture transitive – Warshall

3. Plus courts chemins

4. Plus court chemin – Dijkstra

.

Connexit´ e forte (1/11)

Composantesfortement connexes= parties maximales o`u toute paire de sommets distincts est reli´ee par un chemin.

1

2

3 4 5

6 10 12

7 9

8

11

13

15 14

12 10

11

.

Connexit´ e forte (2/11)

0

0 0

1 1 1

2 1 2

3

1 3

4 3 4

5

5 5

6 5 6

7 5

7

8

6 8

9 0 9

10

8 10

11

8 11

12

8 12

13 10 13

14

0

14 15 0

15

16 13 5 16

(point d’attaches, cf. biconnexit´e)

(2)

.

Connexit´ e forte (3/11)

0

0

1 1

2 1

3

1

4 3

6

6

7

6

8

6

9

0

10

8

11

8

12

8

13 10

14

0

15 0

16 13

(point d’attaches, cf. biconnexit´e)

.

Connexit´ e forte (4/11)

0

0

1 1

2 1

3

1

4 3

9

0

10

9

11

9

12

9

13 10 14

0

15 0

16 13

(point d’attaches, cf. biconnexit´e)

.

Connexit´ e forte (5/11)

0

0

9

0

10

9

11

9

12

9

13 10 14

0

15 0

16 13

(point d’attaches, cf. biconnexit´e)

.

Connexit´ e forte (6/11)

∞ ∞

(point d’attaches, cf. biconnexit´e)

(3)

.

Connexit´ e forte (7/11)

0

1

6

6

5

point d’attachesen fonc´e ≡premier sommet visit´e pardfs

.

Connexit´ e forte (8/11)

LegrapheG0= (V0, E0)des composantes fortement connexesdu grapheG= (V, E)est d´efini par :

• V0={C|C composante fortement connexe de G}

• E0={(C, C0)| ∃e, e∈E ∧ org(e)∈C ∧ ext(e)∈C0}.

C5 C1

C6 C0

Proposition 1 Le graphe G= (V0, E0)des composantes fortement connexes deG= (V, E)est acyclique.

.

Connexit´ e forte (9/11)

[Tarjan, 72]

static int numOrdre;

static void imprimerCompFortementConnexes (Graphe g) { int n = g.succ.length; int num = new int[n]; numOrdre = -1;

for (int x = 0; x < n; ++x) num[x] = -1;

Pile p = new Pile(n);

for (int x = 0; x < n; ++x) if (num[x] == -1)

imprimerComposanteDe(g, x, num, p);

}

.

Connexit´ e forte (10/11)

[Tarjan, 72]

static int imprimerComposanteDe (Graphe g, int x, int[ ] num, Pile p) { Pile.empiler(x, p);

int min = num[x] = ++numOrdre;

for (Liste ls = g.succ[x]; ls != null; ls = ls.suivant) { int y = ls.val; int m;

if (num[y] == -1)

m = imprimerComposanteDe (g, y, num, p);

else m = num[y];

min = Math.min (min, m);

}

if (min == num[x]) { int y; do {

y = Pile.depiler(p);

System.out.print (y + " ");

num[y] = g.succ.length; // ´equivalent `a num[y]← ∞ } while (y != x);

System.out.println();

min = g.succ.length;

}

return min;

}

(4)

.

Connexit´ e forte (11/11)

Lepoint d’attache est le sommet en premier visit´e pardfs

• pour un circuit : testacyclicit´e

• pour tous les circuits ´el´ementaires contenant un fils dans l’arbre de recouvrement d’un sommet donn´e : points d’articulationdans un graphe non-orient´e.

• pour une composantefortement connexe: points d’attache de cette composante

• Les arcs de retourev´erifientnum[ext(e)]<num[org(e)]

⇒calculs de minimum

⇒arithm´etique sur la num´erotation pardfs

• Complexit´eO(V +E)≡ lin´eaire sur le nombre de sommets et d’arcs DoncO(V2)dans le pire cas.

Fin de dfs

.

Fermeture transitive (1/3)

0

1 2 3

4

0

1 2 3

4

Le grapheG+= (V, E+)de la fermeture transitive deG+= (V, E)est tel queE+est minimum v´erifiant

• E⊂E+

• (x, y)∈E+ ∧ (y, z)∈E+ ⇒ (x, z)∈E+ (transitivit´e)

.

Fermeture transitive (2/3)

E matricen×nd’adjacence pour un graphe avec nsommets.

On veut calculer

E+ = E+E2+E3+· · ·

= E+E2+E3+· · ·+En−1

puisque les chemins passant par des sommets distincts sont de longueur inf´erieure `a n.

La multiplication de matrices n×na une complexit´e O(n3).

La fermeture transitive peut donc se faire enO(n4) op´erations.

Faire mieux ?

.

Fermeture transitive (3/3)

D´efinition inductive des chemins selonle plus grand des nœuds interm´ediairespar lesquels ils passent.

Ek est la fermeture transitive en n’utilisant des chemins passant par des sommets interm´ediaires strictement inf´erieurs `ak.

E0=E

Ek+1=Ek∪ {(x, y)|(x, k)∈Ek,(k, y)∈Ek} [Warshall]

static Graphe fermetureTransitive (Graphe g) { int n = g.e.length;

Graphe gplus = copieGraphe (g);

for (int k = 0; k < n; ++k) for (int x = 0; x < n; ++x)

for (int y = 0; y < n; ++y)

gplus.e[x][y] = gplus.e[x][y] || (gplus.e[x][k] && gplus.e[k][y]);

return gplus;

}

Complexit´e enO(n3)ou encoreO(V3).

(5)

.

Plus courts chemins (1/2)

G= (V, E, d)est un graphe valu´e (d:V ×V 7→N).

d(x, y)est la distancedex`ay.

1 10

2

4

2 3 4

3

8

7 5

3 4

On repr´esenteG par sa matrice d’adjacenced`a valeursenti`eres.

On posed(x, y) = +∞si pas d’arc dex`a y.

.

Plus courts chemins (2/2)

Plus courts chemins entretousles sommets d’un graphe.

dkx,y est la longueur du plus court chemin entrex etypassant par des sommets interm´ediaires strictement inf´erieurs `a k.

d0x,y=d(x, y)

dk+1x,y = min{dkx,y, dkx,k+dkk,y} [Floyd-Warshall]

static Graphe plusCourtsChemins (Graphe g) { int n = g.d.length;

Graphe gplus = copieGraphe (g);

for (int k = 0; k < n; ++k) for (int x = 0; x < n; ++x)

for (int y = 0; y < n; ++y)

gplus.d[x][y] = Math.min (gplus.d[x][y], gplus.d[x][k] + gplus.d[k][y]);

return gplus;

}

Complexit´e enO(n3) ou encoreO(V3). Espace m´emoire enO(n2).

Floyd-Warshall= programmation dynamique(cf. cours 4).

.

Plus court chemin (1/5)

Plus court chemin entredeuxsommets xet ydans un graphe valu´e.

Soit dx,y sa longueur.

distx,x= 0

distx,z= min{distx,y+d(y, z)|0≤y < n}

x y z

.

Plus court chemin (2/5)

Plus court chemin entreun sommetx ettousles autres sommets.

(Probl`eme g´en´eralis´e)

• On envoie uneondede la sourcex vers les sommets destination.

• Deux sous-ensemblesS etQ deV :

– S sommetsNOIR dont la distance dex minimale est d´efinitive ; – Q sommetsGRIS accessibles `a partir de xdont on ne connait

que partiellement la distance minimale depuis x.

• Au d´ebutS=∅, Q={x}

• Soityle sommet `a distance minimale depuis xdansQ. On fait NOIR S←S∪ {y}

GRIS Q←Q− {y} ∪ {z|(y, z)∈E, z6∈S}

• Pour les nouveaux dansQ, on met `a jour la distance minimale connue `a partir dex. (relaxation)

• Parcours en largeur selon la distance `a x; algorithme glouton (cf. cours 4)

(6)

.

Plus court chemin (3/5)

[Dijkstra, 1959] Ex´ecution

static int[ ] plusCourtChemin (GrapheV g, int x, int u) { int n = g.succ.length; int[ ] couleur = new int[n];

int[ ] dMin = new int[n]; int[ ] chemin = new int[n];

for (int t = 0; t < n; ++t) {

couleur[t] = BLANC; dMin[t] = Integer.MAX_VALUE;

chemin[t] = -1;

}

dMin[x] = 0; couleur[x] = GRIS; int y;

while ( (y = iMin(dMin, couleur)) != -1) { couleur[y] = NOIR;

if (y == u) return chemin;

for (ListeV ls = g.succ[y]; ls != null; ls = ls.suivant) { int z = ls.val; int dyz = ls.d;

if (dMin[y] + dyz < dMin[z]) {

dMin[z] = dMin[y] + dyz; //relaxation chemin[z] = y; couleur[z] = GRIS;

} } }

return chemin;

}

o`uiMin(dMin, couleur)rend l’indice du minimumGRISdansdMin

.

Plus court chemin (4/5)

[Dijkstra, 1959] Ex´ecution

static int[ ] plusCourtChemin (GrapheV g, int x, int u) { int n = g.succ.length; int[ ] couleur = new int[n];

int[ ] dMin = new int[n]; int[ ] chemin = new int[n];

for (int t = 0; t < n; ++t) {

couleur[t] = BLANC; dMin[t] = Integer.MAX_VALUE;

chemin[t] = -1;

}

dMin[x] = 0; couleur[x] = GRIS; int y;

while ( (y = iMin(dMin, couleur)) != -1) { couleur[y] = NOIR;

for (ListeV ls = g.succ[y]; ls != null; ls = ls.suivant) { int z = ls.val; int dyz = ls.d;

if (dMin[y] + dyz < dMin[z]) {

dMin[z] = dMin[y] + dyz; //relaxation chemin[z] = y; couleur[z] = GRIS;

} } }

return chemin;

}

o`uiMin(dMin, couleur)rend l’indice du minimumGRISdansdMin

.

Plus court chemin (5/5)

Complexit´e enO(V2+E), soitO(n2). M´emoire enO(n).

En utilisant des files de priorit´e pour retrouver le sommet `a distance minimum et changer la distance par relaxation, on arrive `a

Complexit´e enO((V+E) logV), soitO(n2logn). M´emoire enO(n).

(On peut ramener `aO(VlogV+E), soitO(n2)avec destas de Fibonacci).[Fredman, Tarjan]

Exercice 1 Calculer le plus court chemin depuis tous les sommets jusqu’`a un mˆeme sommet destination.

Exercice 2 Que se passe-t-il s’il y a des distances n´egatives ?

.

Autres probl` emes sur les graphes

• Planarit´e (dfs,[Tarjan, 72])

• Circuit hamiltonien

• Voyageur de commerce

• Coloriage de graphe, coloriage de graphes planaires

• Optimisation de flot

• Matching

• Couverture

• Isomorphisme de graphes, de sous-graphes,

• etc

Probl`eme ouvert

Beaucoup de probl`emes sur les graphes sontNP-complets.

Références

Documents relatifs

Exercice 1 Calculer le plus court chemin depuis tous les sommets jusqu’` a un mˆ eme sommet destination.. Exercice 2 Que se passe-t-il s’il y a des distances n´

Si on désigne par x=OH, y=DH et z=FK (voir le parcours n°1), on calcule pour chacun des parcours la longueur de la ligne brisée passant par les 7 points en fonction de x,y et z..

Le chemin de Mona est tracé en bleu sur le 2 ème dessin.. Le chemin d’Elio est tracé en noir sur le

a - Ecrire un programme pour afficher un d´ egrad´ e de couleur entre les couleurs rouge et verte : chaque point de coordonn´ ees (x, y) devra avoir une intensit´ e de couleur rouge

&#34;Possédant initialement un couple de lapins, combien de couples obtient-on en douze mois si chaque couple engendre tous les mois un nouveau couple à compter du second mois de

Chaque algorithme de ce chapitre appelle S OURCE -U NIQUE -I NITIALISATION , puis relâche les arcs de manière réitérée. En outre, le relâchement est la seule façon de modifier

De même que la multiplication matricielle classique est associative, de même la multiplication matricielle définie par la procédure E XTENSION -P LUS - C OURTS -C HEMINS est

Mathias est dans sa maison et décide de rendre visite à quatre de ses amis (Julie, Léo, Fabien et Kevin) en VTT?. Dans quel ordre doit-il rencontrer ses amis pour effectuer le