Plan
• Implantations d'un graphe
• Parcours d'un graphe
• Algorithme de Roy-Warshall
• Algorithme de Floyd
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];
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
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
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
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
Comparaison des tailles
Graphe à n sommets et m arcs.
Matrice d'adjacence : n2 Matrice d'incidence : nm
Liste de successeurs : n + m
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
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
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);
} }}
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
∪
Fk0 ≤ k ≤ n
F = {1}
F = {2, 3}
F = {4, 5, 6, 7}
0
1
2
1
2
3
4 5 6
7
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
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.
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
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
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)
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)
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).
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
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).
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
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
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).
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
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
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 .
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