Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/12/2010, 19:40
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: [Aporte] Sencilla implementación de grafos

Sigo añadiéndole nuevos métodos y optimizando en código. Esta vez le añadí búsqueda a lo profundo y a lo ancho.

Código Python:
Ver original
  1. #Simple graph implementation:
  2. #Directed or undirected graph
  3. #Without weight in the edges, yet
  4. #Edges and vertices can't be repeated
  5. #DFS and BFS added
  6.  
  7. class Graph:
  8.     def __init__(self):
  9.         self.graph = {}
  10.    
  11.     def __get_iterator(self, obj):
  12.         try:
  13.             iterator = iter(obj)
  14.         except TypeError:
  15.             iterator = (obj, )
  16.         return iterator
  17.  
  18.     def add_vertex(self, vertex):
  19.         """
  20.            Add vertex to the graph
  21.        """
  22.         for i in self.__get_iterator(vertex):
  23.             self.graph[i] = set()
  24.  
  25.     def del_vertex(self, vertex):
  26.         """
  27.            Remove the vertex if it's in the graph
  28.            And all the edges
  29.        """
  30.         vertex = set(self.__get_iterator(vertex))
  31.         for i in vertex:
  32.             if i in self.graph:
  33.                 self.graph.pop(i)
  34.         for i in self.graph.iterkeys():
  35.             self.graph[i] -= vertex
  36.        
  37.     def is_vertex(self, vertex):
  38.         """
  39.            Return True if vertex is in the graph
  40.            otherwise return False
  41.        """
  42.         if vertex in self.graph:
  43.             return True
  44.         return False
  45.  
  46.     def add_edge(self, src, dest, undirected=True):
  47.         """
  48.            Add a edge from src to dest
  49.            Or add edges from the cartesian product of src cross dest
  50.            Example: add_edge((1, 2, 3), (2, 3))
  51.            Add the edges:
  52.                (1, 2)
  53.                (1, 3)
  54.                (2, 3)
  55.                (3, 2)
  56.        """
  57.         for s in self.__get_iterator(src):
  58.             if s not in self.graph:
  59.                 self.graph[s] = set()
  60.             for d in self.__get_iterator(dest):
  61.                 if s == d:
  62.                     continue
  63.                 if d not in self.graph:
  64.                     self.graph[d] = set()
  65.                 self.graph[s].add(d)
  66.                 if undirected:
  67.                     self.graph[d].add(s)
  68.  
  69.     def delete_edge(self, src, dest):
  70.         """
  71.            Remove the edge from src to dest
  72.            Or the edges of the cartesian product of src cross dest
  73.            Example: delete_edge((1, 2, 3), (2, 3))
  74.            Will delete the edges:
  75.                (1, 2)
  76.                (1, 3)
  77.                (2, 3)
  78.                (3, 2)
  79.        """
  80.         dest = set(self.__get_iterator(dest))
  81.         src = set(self.__get_iterator(src))
  82.         for i in src:
  83.             if i in self.graph:
  84.                 self.graph[i] -= dest
  85.  
  86.     def get_edge(self, vertex):
  87.         """
  88.            Return the neighbors of a vertex if the vertex is in the graph
  89.        """
  90.         return self.graph[vertex]
  91.    
  92.     def walk(self, source, topdown=False):
  93.         """
  94.        Walk through the graph:
  95.            DFS(Deep First Search)if topdown = True
  96.            Otherwise BFS(Breath First Search)
  97.        """
  98.         v = set()
  99.         l = [source]
  100.         if topdown:
  101.             print "DFS:"
  102.         else:
  103.             print "BFS:"
  104.         v.add(source)
  105.         while l:
  106.             node = l.pop()
  107.             print node,
  108.             for i in self.graph[node]:
  109.                 if i not in v:
  110.                     v.add(i)
  111.                     if topdown:
  112.                         l.append(i)
  113.                     else:
  114.                         l.insert(0, i)
  115.         print ""
  116.  
  117.     def __str__(self):
  118.         #Print the vertex
  119.         s = "Vertex -> Edges\n"
  120.         for k, v in self.graph.iteritems():
  121.             s += "%-6s -> %s\n" % (k, v)
  122.         return s
  123.  
  124. if __name__ == '__main__':            
  125.     graph = Graph()
  126.     graph.add_edge(1, (2, 3))
  127.     graph.add_edge(2, (4, 5))
  128.     graph.add_edge(3, (6, 7))
  129.     print graph

Grafo del ejemplo:

Última edición por razpeitia; 26/12/2010 a las 19:52