mathématiques appliquées (ECG 1re année) · Chapitre 11 · Application directe du cours
Lire un graphe
Informatique et algorithmique · Graphes · niveau 1 (application)
Énoncé
Soit un graphe non orienté en listes d'adjacence. Écrire voisins(G, s), sont_voisins(G, u, v) et nb_aretes(G), puis donner les valeurs sur cet exemple.
Corrigé
Le code.
G = {0: [1, 2], 1: [0, 2], 2: [0, 1, 3], 3: [2]}
def voisins(G, s):
return G[s]
def sont_voisins(G, u, v):
return v in G[u]
def nb_aretes(G):
total = 0
for s in G:
total = total + len(G[s])
return total // 2 # chaque arete compte dans DEUX listes
print(voisins(G, 2)) # [0, 1, 3]
print(sont_voisins(G, 0, 3)) # False
print(sont_voisins(G, 2, 3)) # True
print(nb_aretes(G)) # 4
Les arêtes de l'exemple. Ce sont , , et : il y en a bien . La somme des longueurs des listes vaut , et .
Le // 2 est essentiel. Dans un graphe non orienté, chaque arête figure deux fois dans la structure : dans G[u] et dans G[v]. Sans la division, on compterait chaque arête deux fois. Sur un graphe orienté, en revanche, la somme des longueurs donne directement le nombre d'arcs, et diviser serait une erreur.
Le coût des deux représentations. Avec les listes d'adjacence, tester v in G[u] parcourt la liste des voisins de u : le coût dépend du degré de u. Avec une matrice d'adjacence, le même test se ferait en une seule lecture A[u][v], mais la matrice occuperait cases même si le graphe a peu d'arêtes. Le choix dépend donc de ce qu'on fait le plus souvent, et du nombre d'arêtes que porte le graphe.
Un contrôle de saisie. Le sommet est bien dans G[2] et est bien dans G[3] : la structure est symétrique, comme doit l'être un graphe non orienté. Une asymétrie fausserait silencieusement les degrés et le compte des arêtes.