• Aucun résultat trouvé

Plan• Implantations d'un graphe• Parcours d'un graphe• Algorithme de Roy-Warshall• Algorithme de Floyd

N/A
N/A
Protected

Academic year: 2022

Partager "Plan• Implantations d'un graphe• Parcours d'un graphe• Algorithme de Roy-Warshall• Algorithme de Floyd"

Copied!
27
0
0

Texte intégral

(1)

Plan

• Implantations d'un graphe

• Parcours d'un graphe

• Algorithme de Roy-Warshall

• Algorithme de Floyd

(2)

Matrice d'adjacence

Mi,j = {

0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 si (i, j) G

1 si (i, j) G

1 2

3 4

int graphe[N][N];

(3)

Exemple d'utilisation

Thm Soit M la matrice d'adjacence d'un graphe G. Pour tout n ≥ 0, Mi,j est égal au nombre de chemins de longueur n de i à j.

Remarque Si M est considérée comme matrice booléenne, on a

Mi,j = {

n

n 1 s'il existe un chemin de longueur n de i à j 0 sinon

(4)

Matrice d'incidence

1 si i est l'origine de a Mi,a = { -1 si i est l'extrémité de a

0 sinon

Exercice : montrer que M est unimodulaire, i. e. le déterminant de toute sous-matrice carrée de M vaut 0, -1 ou 1.

(Graphe sans boucle)

1 0 1 0 -1 -1 1 0 0 0 0 0 0 -1 1 0 -1 -1 1 0

1 2

3 4

1

2 3

4 5

(5)

Thm La matrice d'incidence d'un graphe est unimodulaire.

Preuve Récurrence sur n, taille de la matrice carrée extraite.

• Clair pour n = 1

• On développe le calcul du

déterminant Dn par rapport à une colonne.

- Si une colonne est nulle, Dn = 0 - Si une colonne contient un seul coefficient non nul, 1 ou -1,

Dn = ± Dn-1

- Toutes les colonnes ont deux coefficients non nuls (1 et -1).

Dans ce cas, la somme des colonnes est nulle et Dn = 0

(6)

Liste de successeurs

1 : 2 4 ω 2 : 4 ω 3 : 3 ω 4 : 3 ω

#define NMax 30

(* Nombre maximal de sommets *)

#define DegreMax 5

(* Degré maximal d'un sommet *)

#define OMEGA -1 typedef int Sommet;

Sommet graphe[NMax][DegreMax];

(ou liste chaînée…)

1 2

3 4

(7)

Comparaison des tailles

Graphe à n sommets et m arcs.

Matrice d'adjacence : n2 Matrice d'incidence : nm

Liste de successeurs : n + m

(8)

Parcours d'un graphe connexe non orienté à partir d'un sommet s C'est une suite S de sommets t.q.

(1) s est le premier sommet de S

(2) Chaque sommet apparaît une fois et une seule dans S

(3) Tout sommet sauf la racine est adjacent à un sommet placé avant lui dans la liste.

Exemple : 5 3 6 2 1 4 7 est un parcours issu de 5

1

2

3

4 5 6

7

(9)

On obtient une arborescence de Trémeaux.

Ici, en partant de s = 1 :

Complexité (n sommets, m arêtes) O(n + m) avec des listes de

successeurs, O(n2) avec des matrices d'incidence

Parcours en profondeur Initialisation : S = (s)

Si S = (s1 , …, sn-1), on prend pour sn un voisin de sn-1, ou, à défaut, un voisin de sn-2, ou, à défaut, un voisin de sn-3, etc.

1

2

3

5 6 7

4

(10)

Trémeaux Récursif

#define Nmax 50

typedef int Sommet;

typedef Sommet

GrapheSuc[Nmax][Sucmax];

typedef Sommet Arbo[Nmax];

void TremauxRec(Sommet u, Arbo pere, GrapheSuc succ, int n)

{ int k;

Sommet v;

for (k = 1; succ[u][k] != Omega; ++k) { v = succ[u][k];

if (pere[v] == Omega) {

pere[v] = u;

TremauxRec(v, pere, succ, n);

} }}

(11)

Parcours en largeur à partir d'un sommet s F0 = {s}

Fn+1 est constitué de l'ensemble des successeurs des éléments de Fn moins les éléments de

Fk

0 k n

F = {1}

F = {2, 3}

F = {4, 5, 6, 7}

0

1

2

1

2

3

4 5 6

7

(12)

Arborescences

On peut représenter une arbores - cence à l'aide de la fonction père.

Convention : la racine est son propre père

typearborescence = array [1..Nmax] of integer;

[1, 1, 1, 2, 3, 2, 4]

Exercice : Calculer la fonction père en partant de l'une des trois représentations d'un graphe.

Une arborescence maximale

1

2

3

4 5 6

7 1

2

3

4 5 6

7

(13)

Arborescence

des plus courts chemins

Soit F un parcours en largeur à partir de s d'un graphe G. Pour chaque sommet v ≠ s, il existe un premier élément v' de F tel que (v', v) soit un arc du graphe. Soit G(s) le sous-graphe constitué de ces arcs.

Proposition

(1) G(s) est une arborescence (2) x ∈ G(s) ssi il existe un

chemin de s à x

(3) Si x ∈ G(s), le chemin de s à x dans G(s) est un plus court chemin de s à x dans G.

(14)

Relation d'accessibilité (fermeture transitive)

Soit S = {1, 2, …, n} les sommets.

Soit G0 le graphe initial, complété d'une boucle en chaque sommet.

On note Gk le graphe (S, Ak) avec (i, j) Ak ssi il existe dans G0 un chemin de i à j dont les sommets internes sont dans {1, 2, …, k}

Proposition

• On a (i, j) Ak ssi (i, j) Ak-1 ou (i, k) Ak-1 et (k, j) Ak-1

• Pour j = k, on trouve

(i, k) Ak ssi (i, k) Ak-1

(15)

1 2

3

4 5

0 1 0 0 0 0 0 1 0 0 A = 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0

Matrice d'adjacence

1 1 0 0 0 0 1 1 0 0 A0 = 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0

0 1 1 0 0 A1 = 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1

1 1 1 0 0 0 1 1 0 0 A2 = 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1

1 1 1 1 1 A3 = 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1

1 1 1 1 1 1 1 1 1 1 A4 = 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1

(16)

Programme

void RoyWarshall(GrapheMat *g, int n) { int i, j, k;

for (i = 0; i < n; i++) (*g)[i][i] = 1;

for (k = 0; k < n; k++) for (i = 0; i < n; i++)

if ((*g)[i][k])

for (j = 0; j < n; j++)

(*g)[i][j] = (*g)[i][j] ||

((*g)[i][k] && (*g)[k][j]);

}

Complexité : O(n3)

(17)

Justification

On suppose qu'à l'étape k, i, j,

M[i,j] contient Mi,j avant la ligne

M[i,j] := M[i,j] or (M[i,k] and M[k,j])

Alors M[i, k] contient

Mi,k si k ≥ j et Mi,k si k < j et M[k, j] contient

Mk,j si k ≥ i et Mk,j si k < i D'après la proposition, on aura dans tous les cas :

M[i,j] = Mi,j or (Mi,k and Mk,j )

= Mi,j

(k-1)

(k-1) (k)

(k-1) (k)

(k-1) (k-1) (k-1)

(k)

(18)

Complexité

• Le parcours en profondeur conduit à un algorithme pour la fermeture transitive en

O(n(m + n)) (listes)

O(n3) (matrices)

• L'algorithme de Roy-Warshall est en O(n3).

(19)

Il s'agit de trouver les chemins

élémentaires de valeur maximum.

Soit Mi,j la valeur maximale des chemins élémentaires de i à j dont les sommets intérieurs sont dans {1, 2, …, k}.

M(0)i,j = {

e si (i, j) A et i ≠ j, 0 si i = j,

- ∞ sinon.

(k)

Mi,j(k) = max {Mi,j(k-1) , M(k-1)i,k + M(k-1)k,j } 0 1 - ∞ -3 - ∞ 0 - ∞ 2 -1 - ∞ 0 - ∞ - ∞ - ∞ 2 0

1 2

3 4

1 -3 2

2 -1

(20)

Floyd

type

matrice = array [1.. NMax, 1.. NMax ] of integer;

procedure Floyd(var M : matrice, n : integer);

var i, j, k : Sommet;

begin

for i := 1 to n do M[i, i] := 0 ;

for k := 1 to n do for i := 1 to n do

for j := 1 to n do

M[i,j] := Max(M[i,j], M[i,k] + M[k,j]) end;

L'algorithme de Floyd est en O(n3).

(21)

1 2

3

4 5

Résultat

0 1 * * *

* 0 2 * * A0 = -3 * 0 2 1

* * * 0 -4

* * * 3 0

0 1 * * *

* 0 2 * * A1 = -3 -2 0 2 1

* * * 0 -4

* * * 3 0 0 1 3 * *

* 0 2 * * A2 = -3 -2 0 2 1

* * * 0 -4

* * * 3 0

0 1 3 5 4 -1 0 2 4 3 A3 = -3 -2 0 2 1

* * * 0 -4

* * * 3 0 0 1 3 5 4

-1 0 2 4 3 A4 = -3 -2 0 2 1

* * * 0 -4

* * * 3 0

-3 2

2 1

-4 3

0 1 3 7 4 -1 0 2 6 3 A5 = -3 -2 0 4 1

* * * 0 -4

* * * 3 0

(22)

Il s'agit de trouver les chemins les plus courts.

Soit Mi,j la valeur maximale des chemins élémentaires de i à j dont les sommets intérieurs sont dans {1, 2, …, k}.

M(0)i,j = {

e si (i, j) A et i ≠ j, 0 si i = j,

+ ∞ sinon.

(k)

Mi,j(k) = min {M(k-1)i,j , M(k-1)i,k + M(k-1)k,j } 0 1 + ∞ 3 + ∞ 0 + ∞ 2 1 + ∞ 0 + ∞ - ∞ + ∞ 2 0

1 2

3 4

1 3 2

2 1

(23)

type

matrice = array [1.. NMax, 1.. NMax ] of integer;

procedure PlusCourtChemin(var M : matrice, n : integer);

var i, j, k : Sommet;

begin

for i := 1 to n do M[i, i] := 0 ;

for k := 1 to n do for i := 1 to n do

for j := 1 to n do

M[i,j] := Min(M[i,j], M[i,k] + M[k,j]) end;

L'algorithme est en O(n3).

(24)

1 2

3

4 5

Résultat

0 1 * 3 *

* 0 2 * * A0 = 3 * 0 4 1

* * * 0 2

* * * 2 0

0 1 * 3 *

* 0 2 * * A1 = 3 4 0 4 1

* * * 0 2

* * * 2 0 0 1 3 3 *

* 0 2 * * A2 = 3 4 0 4 1

* * * 0 2

* * * 2 0

0 1 3 3 4 5 0 2 6 3 A3 = 3 4 0 4 1

* * * 0 2

* * * 2 0 0 1 3 3 4

5 0 2 6 3 A4 = 3 4 0 4 1

* * * 0 2

* * * 2 0

3 2

4 1

2 2

0 1 3 3 4 5 0 2 5 3 A5 = 3 4 0 3 1

* * * 0 2

* * * 2 0 3

(25)

Tri topologique

Un graphe est dit sans circuit si sa fermeture transitive est une relation d'ordre partielle sur l'ensemble des sommets.

Prop. Toute relation d'ordre partielle admet une extension linéaire (relation d'ordre total).

Effectuer un tri topologique sur un graphe sans circuit consiste à trouver une extension linéaire.

1

2

3

4 5 6

7

1 < 2 < 3 <4 < 5 < 6 < 7

(26)

Tri topologique

On peut le réaliser à partir du parcours (récursif) en profondeur en partant d'un sommet sur lequel aucun arc n'aboutit dans le graphe dual.

Il suffira d'ajouter un

printf("%d", v)

à la fin de la procédure Tremeaux .

(27)

Arborescences préfixes

Définition : Pour tout sommet i, l'ensemble des descendants de i est de la forme [i,i'].

1

8 2

9 10 3 5

11 13 12 4 6 7

[1…13]

[8…13] [2…7]

[10…13] [3, 4] [5…7]

9

11 13 12 4 6 7

Références

Documents relatifs

En justifiant, associer à chacun des 4 nuages de points qui suivent l’un des coefficients de corrélation, ainsi que les séries étudiées :.. rang mondial des écoles de

Résumé. — Nous présentons dans cet article un algorithme qui fournit une décomposition d'un graphe en sous-graphes faiblement interconnectés. Nous montrons que le résultat est

Sur ce cycle il y a au moins un sommet z de degré d(z) ^ 3, parce qu'au cas contraire l'arbre partiel initial était une chaîne hamiltonienne, ce qui contredit notre hypothèse.

On considère un graphe dont les sommets sont numérotés de 1 à N. b) Quelle sera la matrice des prédécesseurs, P, de ces graphes dans laquelle la valuation de chaque

On peut le réaliser à partir du parcours (récursif) en profondeur dans le graphe dual en partant d'un sommet sur lequel aucun arc n'aboutit.. Il suffira

On peut le réaliser à partir du parcours (récursif) en profondeur en partant d'un sommet sur lequel aucun arc n'aboutit dans le graphe dual, en affichant les sommets

La conception de notre m´ ethode de s´ eparation et ´ evaluation progressive a ´ et´ e guid´ ee par une constatation : la borne inf´ erieure que nous pr´ econisons n´ ecessite

(b) A chaque étape de l'algorithme, choisir arbitrairement un sommet en dehors de ceux qui ont déjà été retenus dans la construction, et relier par l'arête de poids le plus faible,