2. Graphes
Sage possède des fonctions pour gérer les graphes, comme suit
•Initialiser un graphe orienté (resp. non orienté) vide avec le constructeur DiGraph()
(resp. Graph()).
•Ajouter les sommets avec la commande add_vertex ou add_vertices
•Ajouter les arcs (resp. arêtes) avec la commande add_edge ou add_edges.
Pour connaitre les fonctions implémentés sur les graphes, il suffit d’entrer le nom d’une
instance de graphe (par exemple ici on a initialisé G=Graph()), suivi du point ’.’ et faire
tab pour que s’affiche la liste des 257 fonctions prédéfinies dans la librairie. Par exemple
la fonction G.topological_sort() retourne une liste topologique si le graphe est sans
circuit.
Exercice 4. On rappelle que la matrice d’incidence d’un graphe orienté G= (S, A)est
la matrice ∆tel que δxa = 1 si xest l’origine de l’arc a,−1si xest l’extrémité de l’arc a
et 0sinon.
(1) Construire et afficher le graphe du TD donné par la matrice d’adjacence
0100010
0011000
0000000
0000100
0000001
0100101
0010000
On souhaite automatiser le passage de la matrice d’adjacence à la matrice d’incidence.
(2) Comment lit-on le nombre d’arêtes sur la matrice d’adjacence ?
(3) Donner un algorithme qui calcule la matrice d’adjacence à partir de la matrice
d’incidence. Quel est son coût ?
(4) Donner un algorithme qui calcule la matrice d’incidence à partir de la matrice
d’adjacence. Quel est son coût ?
On pourra utiliser les fonctions G.adjacency_matrix() ou G.incidence_matrix() déjà
implémentées pour obtenir des exemples à partir d’un graphe aléatoire donné par la
fonction digraphs.RandomDirectedGNM(10,20) (ici à 10 sommets et 20 arcs). On aura
besoin des fonctions Matrix(n,n),nrows(),augment() et delete_columns().
(5) On cherche maintenant à passer du graphe à la matrice d’adjacence. On utilisera
pour cela les fonctions neighbors_out(),stack() et delete_rows().
Soit nle nombre de sommets de G.
(6) Montrer que pour tout 1≤k≤n, le coefficient (i,j), noté mk
ij , de la matrice Mk
est égal au nombre de chemins de longueur kdu sommet iau sommet j.
(7) Essayer sur un exemple. Comparer avec la fonction adjacency_matrix().
Exercice 5. Implémenter les algorithmes de Roy-Warshall et Floyd.
Exercice 6. Quelle est la taille du plus grand sous-ensemble S⊂ {1,...,100}qui ne
contient pas i, j tel que |i−j|soit un carré parfait ? Une fois le problème modélisé par un
graphe, on pourra utiliser la fonction independent_set() qui retourne un sous-ensemble
maximum d’éléments deux à deux non adjacents.
3