TP16 Graphes Intro-Corrigé

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 7

TP n°16 : Introduction aux graphes

Pour alléger les écritures dans ce TP, on notera :

• graphe NPNO : non pondéré et non orienté


• graphe NPO : non pondéré et orienté
• graphe PNO : pondéré et non orienté

1. Graphes non pondérés


1.1. Étude préliminaire
Voici un exemple de graphe non pondéré et non orienté :

et un autre graphe non pondéré similaire au précédent mais orienté :

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.

1. Pour le graphe de gauche ci-dessus, créez deux variables : sa liste d'adjacence


listeNPNO et sa matrice d'adjacence matriceNPNO .
2. Pour le graphe de droite ci-dessus, créez deux variables : sa liste d'adjacence
listeNPO et sa matrice d'adjacence matriceNPO .
listeNPNO = [
[1, 3],
[0, 2, 3, 4],
[1, 4],
[0, 1],
[1, 2]
]
matriceNPNO = [
[0, 1, 0, 1, 0],
[1, 0, 1, 1, 1],
[0, 1, 0, 0, 1],
[1, 1, 0, 0, 0],
[0, 1, 1, 0, 0]
]
listeNPO = [
[1, 3],
[2, 4],
[4],
[1],
[]
]
matriceNPO = [
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 1],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]
]
Sur papier, dessinez les graphes dont les matrices d'adjacence sont :

⎛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⎠

Réponses : le graphe associé à la matrice M est non orienté.

Celui associé à la matrice N est orienté.

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.

La même fonction doit marcher sur les deux types de graphe.


def matrice2liste(matrice):
liste = []
n = len(matrice)
for i in range(n):
voisins = []
for j in range(n):
if matrice[i][j] > 0:
voisins.append(j)
liste.append(voisins)
return liste

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], []]

1.3. Degré dans un graphe non orienté


Écrivez une fonction degré_sommet_NPNO qui prend en entrée la liste d'adjacence
d'un graphe NPNO et un numéro de sommet et renvoie en sortie le degré de ce sommet.

def degré_sommet_NPNO(graphe, sommet):


return len(graphe[sommet])

print(degré_sommet_NPNO(listeNPNO, 0)) # doit afficher 2


print(degré_sommet_NPNO(listeNPNO, 1)) # doit afficher 4

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.

Elle devra utiliser la fonction degré_sommet_NPNO .

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é

print(degré_NPNO(listeNPNO)) # doit afficher 4

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.

def degré_sommet_NPO(graphe, sommet):


sortant = len(graphe[sommet]) # degré sortant trivial
entrant = 0 # mais du boulot pour le degré entrant !
for s in range(len(graphe)):
if sommet in graphe[s]:
entrant += 1
return entrant, sortant

print(degré_sommet_NPO(listeNPO, 0)) # doit afficher (0, 2)


print(degré_sommet_NPO(listeNPO, 3)) # doit afficher (1, 1)
print(degré_sommet_NPO(listeNPO, 4)) # doit afficher (2, 0)

(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.

Créez deux variables listePNO et matricePNO ayant pour valeur, respectivement, la


liste et la matrice d'adjacence de cet exemple.

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]
]

2.2. Degré d'un sommet


Pour écrire une fonction degré_sommet_PNO qui prend en entrée la liste d'adjacence
d'un graphe pondéré non orienté, quelles modifications faut-il faire à la fonction
degré_sommet_NPNO ?

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.

Réponse : cela revient juste à vérifier si la matrice est symétrique.

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

print(est_orienté(matricePNO)) # doit afficher True


matricePNO[0][1] = (2, 4)
print(est_orienté(matricePNO)) # doit afficher False

False
False

Vous aimerez peut-être aussi

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy