Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/06/2010, 16:46
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
[Aporte] Sencilla implementación de grafos

Aquí una pequeña implementación de grafos en python.

El grafo que estoy implementando sigue las siguientes caracteristicas:
Es un grafo...
  • Dirigido
  • No ponderado

Código Python:
Ver original
  1. class Graph:
  2.     #Simple graph implementation:
  3.     #Directed graph
  4.     #Without weight in the edges
  5.     #Edges can be repeated
  6.  
  7.     def __init__(self):
  8.         self.graph = {}
  9.  
  10.     def add_vertex(self, vertex):
  11.         #Add a vertex in the graph
  12.         #Overwrite the value
  13.         self.graph[vertex] = []
  14.  
  15.     def del_vertex(self, vertex):
  16.         #Remove the vertex if it's in the graph
  17.         try:
  18.             self.graph.pop(vertex)
  19.         except KeyError:
  20.             #Here vertex is not in graph
  21.             pass
  22.     def is_vertex(self, vertex):
  23.         #Return True if vertex is in the graph
  24.         #otherwise return False
  25.         try:
  26.             self.graph[vertex]
  27.             return True
  28.         except KeyError:
  29.             return False
  30.  
  31.     def add_edge(self, vertex, edge):
  32.         #Add a edge in vertex if vertex exists
  33.         try:
  34.             self.graph[vertex].append(edge)
  35.         except KeyError:
  36.             #Here vertex is no in graph
  37.             pass
  38.  
  39.     def delete_edge(self, vertex, edge):
  40.         #Remove a edge in vertex
  41.         try:
  42.             self.graph[vertex].remove(edge)
  43.         except KeyError:
  44.             #Here vertex is not in graph
  45.             pass
  46.         except ValueError:
  47.             #Here the edge not exists
  48.             pass
  49.  
  50.     def get_edge(self, vertex):
  51.         #Return the edges of a vertex if the vertex is in the graph
  52.         #Otherwise return None
  53.         try:
  54.             return self.graph[vertex]
  55.         except KeyError:
  56.             pass
  57.  
  58.     def __str__(self):
  59.         #Print the vertex
  60.         s = "Vertex -> Edges\n"
  61.         for k, v in self.graph.iteritems():
  62.             s+= "%-6s -> %s\n" % (k, v)
  63.         return s
  64.            
  65. graph = Graph()
  66. graph.add_vertex(1)
  67. graph.add_vertex(2)
  68. graph.add_vertex(3)
  69. graph.add_vertex(4)
  70. graph.add_edge(1, 2)
  71. graph.add_edge(1, 4)
  72. graph.add_edge(2, 4)
  73. graph.add_edge(3, 1)
  74. graph.add_edge(3, 2)
  75. graph.add_edge(4, 3)
  76. print graph

El grafo que imprime seria este:
Código:
Vertex -> Edges
1      -> [2, 4]
2      -> [4]
3      -> [1, 2]
4      -> [3]
Aquí su representación gráfica:


Espero hacer un implementación mas bonita estas vacaciones y de paso implementare el algoritmo de dijkstra