Des graphes avec classes

12. Des graphes avec classes#

On va chercher à représenter un graphe, comme structure de données en la munissant de l’interface suivante :

  • une méthode voisins qui renvoie les voisins d’un sommet donné

  • une méthode arete qui ajoute un arc entre \(e_i\) et \(e_j\), les créant si nécessaire.

  • une méthode sommet qui renvoie la liste des sommets.

class Graph:
    def __init__(self):
        self.sommetList = dict()

    def voisins(self, n):
        if n in self.sommetList:
            return self.sommetList[n]
        else:
            return None

    def ajout_arete(self,o,e):
        if o not in self.sommetList:
            self.sommetList[o] = {e: 1}
        else:
            self.sommetList[o][e] = 1
        if e not in self.sommetList:
            self.sommetList[e] = {}

    def sommet(self):
        return list(self.sommetList.keys())

    def __contains__(self,n):
        return n in self.sommetList

    def __iter__(self):
        return iter(self.sommetList.keys)

    def __repr__(self):
        return str(self.sommetList)

    def __getitem__(self, n):
        return self.voisins(n)
g = Graph()
g.ajout_arete('A','B')
g
{'A': {'B': 1}, 'B': {}}
g.ajout_arete('A','E')
g.addArete('B','C')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[6], line 1
----> 1 g.addArete('B','C')

AttributeError: 'Graph' object has no attribute 'addArete'
g.ajout_arete('C','D')
g.ajout_arete('C','E')
g.ajout_arete('D','A')
g.ajout_arete('E','D')
g.ajout_arete('E','B')
g
{'A': {'B': 1, 'E': 1}, 'B': {}, 'E': {'D': 1, 'B': 1}, 'C': {'D': 1, 'E': 1}, 'D': {'A': 1}}
g.sommet()
['A', 'B', 'E', 'C', 'D']
g.voisins('A')
{'B': 1, 'E': 1}
g['A']
{'B': 1, 'E': 1}
'F' in g
False
g['F']