TP16 Graphes Intro-Corrigé
TP16 Graphes Intro-Corrigé
TP16 Graphes Intro-Corrigé
Par convention, dans la matrice d'adjacence d'un graphe non pondéré, on mettra 0 pour
deux sommets qui ne sont pas reliés par une arête ou un arc.
⎛0 1 0 0 0⎞
⎛0 1 1 0⎞
⎜ 0⎟
⎜1 1⎟ ⎜ ⎟
0 0 1 1
M=⎜ ⎟ N =⎜ 1⎟
0 1
⎜1 1⎟ ⎜
⎜
0 0 0 0 ⎟
⎟
⎜0 0⎟
1 0
⎝0 0⎠
0 1 0
1 1 ⎝0 0 0 0 0⎠
1.2. Conversion
Écrivez une fonction matrice2liste qui prend en entrée la matrice d'adjacence d'un
graphe NPNO ou NPO et renvoie en sortie la liste d'adjacence du même graphe.
print(listeNPNO)
print(matrice2liste(matriceNPNO)) # doit être identique au print précédent
print(listeNPO)
print(matrice2liste(matriceNPO)) # doit être identique au print précédent
[[1, 3], [0, 2, 3, 4], [1, 4], [0, 1], [1, 2]]
[[1, 3], [0, 2, 3, 4], [1, 4], [0, 1], [1, 2]]
[[1, 3], [2, 4], [4], [1], []]
[[1, 3], [2, 4], [4], [1], []]
2
4
Écrivez une fonction degré_NPNO qui prend en entrée la liste d'adjacence d'un graphe
et renvoie en sortie le degré du graphe, défini comme le degré maximal de ses sommets.
def degré_NPNO(graphe):
degré = 0
for sommet in range(len(graphe)):
d = degré_sommet_NPNO(graphe, sommet)
if d > degré:
degré = d
return degré
4
1.4. Degrés entrant et sortant dans un graphe orienté
Rappel : pour savoir si la valeur x se trouve dans une liste L , utilisez la clause
booléenne x in L . C'est une recherche linéaire, donc en O(n).
Écrivez une fonction degré_sommet_NPO qui prend en entrée la liste d'adjacence d'un
graphe NPO et un numéro de sommet, et renvoie en sortie les degrés entrant et sortant
de ce sommet.
(0, 2)
(1, 1)
(2, 0)
2. Graphes pondérés
Dans la matrice d'adjacence d'un graphe pondéré, on ne peut pas utiliser 0 pour
indiquer que deux sommets ne sont pas reliés, car il est tout à fait possible que deux
sommets soient reliés par une arête (ou un arc) de poids 0.
Donc on va utiliser +∞. Python fournit une telle valeur pour le type flottant, donc
exécutez la cellule suivante pour disposer d'une variable inf qui représentera +∞
dans la suite de ce notebook.
inf = float("inf")
2.1. Étude préliminaire
On se donne comme exemple le graphe pondéré non orienté de la figure suivante.
listePNO = [
[(1, 9), (2, 3), (4, 7)],
[(0, 9), (2, 1), (3, 8)],
[(0, 3), (1, 1), (3, 4), (4, 2)],
[(2, 4), (1, 8)],
[(0, 7), (2, 2)]
]
matricePNO = [
[inf, 9, 3, inf, 7],
[ 9, inf, 1, 8, inf],
[ 3, 1, inf, 4, 2],
[inf, 8, 4, inf, inf],
[ 7, inf, 2, inf, inf]
]
Réponse : aucune ! La liste des voisins d'un sommet contient toujours un élément par
voisin, peu importe qu'un voisin soit représenté par un simple numéro ou un couple
(numéro, poids).
degré_sommet_PNO = degré_sommet_NPNO
print(degré_sommet_PNO(listeNPNO, 0)) # doit afficher 2
print(degré_sommet_PNO(listeNPNO, 1)) # doit afficher 4
2
4
2.3. Orienté ou non ?
Écrivez une fonction est_orienté qui prend en entrée la matrice d'adjacence d'un
graphe pondéré et renvoie un booléen, True si le graphe est orienté, False sinon.
def est_orienté(graphe):
n = len(graphe)
for i in range(n):
for j in range(i): # parcours du triangle inférieur seulement
if graphe[i][j] != graphe[j][i]:
return False
return True
False
False