Introduction à la théorie des graphes

Fonction rang d'un graphe

Graphes sans circuit

Nous nous intéressons ici à l'ensemble des graphes qui ne contiennent ni boucles ni circuits.

Donc quelque soit le point x, il n'existe pas de chemin de x à x.

Remarque

Un graphe est sans circuit s'il ne contient que des chemins élémentaires.

DéfinitionFonction ordinale d'un graphe

On considère un graphe orienté G=(X,E) et on associe à chaque point x de E une valeur entière notée f(x).

La fonction f est une fonction ordinale du graphe G si l'existence d'un chemin non vide de x à y implique f(x)<f(y).

En conséquence, si l'on parcourt un chemin x1, x2, ..., xp, on a obligatoirement f(x1)<f(x2)<...<f(xp).

DéfinitionFonction rang d'un graphe

La fonction rang d'un graphe est un cas particulier de fonction ordinale où :

- les points sans prédécesseurs ont comme valeur 0,

- tout autre point à une valeur la plus petite possible supérieure ou égale à la valeur de ses prédécesseurs augmentée de 1.

Structures de données utilisées dans l'algorithme de recherche de la fonction rang

La matrice en nombres entiers 0 ou 1 correspondant à la matrice booléenne B associée au graphe :

B(i,j) = 1 s'il existe un arc de i à j et 0 sinon

(B(i,i)=0 : pas de boucle en i).

Un tableau de marques M qui indique si la fonction rang a déjà été calculée pour un point ou pas :

M(i) = 1 si la fonction rang a déjà été calculée pour un point et 0 sinon.

Il est à noter que l'on aurait pu également utiliser le tableau de la fonction rang en lui donnant, par exemple une valeur +∞ quand la valeur n'est pas encore calculée, mais l'algorithme sera plus lisible en utilisant ce tableau de marques.

Un tableau NBPréd qui compte, pour chaque point son nombre de prédécesseurs non encore marqués.

Le nombre de points du graphe est noté n.

Les rangs calculés sont rangés dans le tableau R.

Algorithme de calcul de la fonction rang d'un graphe

Initialisation

Pour tout point i faire

Aucun point n'est marqué

M(i)=0 ;

Calcul du nombre de prédécesseurs de tout point

ndp=0 ;

Pour tout point j faire

si B(j,i)>0 alors ndp++ finsi

Fin pour j

NBPréd(i)=ndp ;

Fin pour i

Nombre de points marqués initialisés à 0

NBPM=0 ;

Valeur courante de la fonction rang

rang=-1 ;

L'algorithme est arrêté si on s'aperçoit que le graphe contient un circuit,

car dans ce cas il est impossible de calculer la fonction rang pour tous les points

circuit = faux ;

Itérations

Tantque NBPM<n et circuit = fauxfaire

une_modif=faux ;

rang=rang+1 ;

Pour tout i faire

si M(i) = 0 et NBPréd(i) = 0 alors

M(i)=1 ; NBPM=NBPM+1 ;

R(i)=rang ;

une_modif=vrai ;

finsi

Fin pour i

si une_modif = faux alors

Le graphe contient un circuit

circuit = vrai ;

sinon

On n'a pas encore détecté que le graphe contient un circuit.

si NBPM<n alors

Il reste des points non marqués.

Les points marqués sont devenus plus nombreux.

Il faut changer le tableau du nombre de prédécesseurs non marqués.

Pour tout point i faire

Calcul du nombre de prédécesseurs non marqués de tout point

ndp=0 ;

Pour tout point j faire

si B(j,i)>0 et M(j)=0 alors ndp++ finsi

Fin pour j

NBPréd(i)=ndp ;

Fin pour i

finsi

finsi

Fin tantque

Si circuit = vrai alors

Le graphe contient un circuit et la fonction rang ne peut être calculé.

sinon

Le tableau R contient le rang de tout point

finsi.

Déroulement de la fonction rang sur des graphes

Cliquez sur Anim pour démarrer l'animation. Choisissez un graphe avec les boutons précédent et suivant. Il est à noter que changer le graphe réinitialise l'algorithme. Utilisez en alternance d-IT et f-IT pour voir se dérouler l'algorithme sur le graphe et sur la matrice en variable 0-1. Le nombre de prédécesseurs des points non marqués de l'itération précédente est mis en bas de la matrice. On a essayé d'utiliser des couleurs. Le gris pour les modifications précédentes et le jaune pour les points intéressants de l'itération en cours.

Complexité de l'algorithme

La complexité de l'algorithme dépend de la représentation choisie du graphe.

Si le graphe est représenté par la liste des prédécesseurs des points. La représentation est proportionnelle au nombre d'arcs. Le comptage du nombre de prédécesseurs est alors proportionnel au nombre d'arcs et il y a au plus n itérations. L'algorithme est alors en O(nm).

Si le graphe est représenté par la matrice en valeurs entières 0-1. Le comptage du nombre de prédécesseurs est en n2 et il y a également n itérations au plus. L'algorithme est en O(n3).

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimerRéalisé avec Scenari (nouvelle fenêtre)