Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. from copy import deepcopy
  2.  
  3. class Grafo:
  4. def __init__(self, v = []):
  5. self.vertices = v
  6. self.arestas = {}
  7. self.distancias = {}
  8.  
  9. if not v == []:
  10. for i in range(len(v)):
  11. self.arestas[v[i]] = []
  12.  
  13. def insere_vertice(self, valor):
  14. self.vertices.append(valor)
  15.  
  16. def insere_aresta(self, v1, v2, custo = 0):
  17. if not self.arestas[v1]:
  18. self.arestas[v1] = []
  19. if not self.arestas[v2]:
  20. self.arestas[v2] = []
  21.  
  22. self.arestas[v1].append(v2)
  23. self.arestas[v2].append(v1)
  24. self.arestas[v1].sort()
  25. self.arestas[v2].sort()
  26. self.distancias[(v1, v2)] = custo
  27.  
  28. def retira_vertice(self, v):
  29. if v in self.vertices:
  30. self.vertices.remove(v)
  31. del self.arestas[v]
  32.  
  33. for vertice in self.vertices:
  34. if v in self.arestas[vertice]:
  35. self.arestas[vertice].remove(v)
  36.  
  37. for aresta in deepcopy(self.distancias):
  38. if v in aresta:
  39. del self.distancias[aresta]
  40.  
  41. def retira_aresta(self, v1, v2):
  42. if v1 not in self.vertices or v2 not in self.vertices: return
  43. if v1 in self.arestas[v2]:
  44. self.arestas[v2].remove(v1)
  45. if v2 in self.arestas[v1]:
  46. self.arestas[v1].remove(v2)
  47.  
  48. for aresta in deepcopy(self.distancias):
  49. if aresta == (v1, v2) or aresta == (v2, v1):
  50. del self.distancias[aresta]
  51.  
  52.  
  53. # DIJKSTRA: menores caminhos de um vértice até todos os outros do grafo
  54. def dijkstra(self, ini):
  55. if ini not in self.vertices: return
  56.  
  57. Q = [] # vértices não-visitados
  58. dist = {}
  59. prev = {}
  60.  
  61. for v in self.vertices:
  62. dist[v] = float('inf')
  63. prev[v] = None
  64. Q.append(v)
  65.  
  66. dist[ini] = 0
  67.  
  68. while Q:
  69. u = Q[0]
  70. for x in Q:
  71. if dist[x] < dist[u]:
  72. u = x
  73.  
  74. Q.remove(u)
  75.  
  76. for v in self.arestas[u]:
  77. alt = dist[u]
  78.  
  79. if (u,v) in self.distancias:
  80. alt += self.distancias[(u,v)]
  81. elif (v,u) in self.distancias:
  82. alt += self.distancias[(v,u)]
  83.  
  84. if alt < dist[v]:
  85. dist[v] = alt
  86. prev[v] = u
  87.  
  88. return dist # ou return dist[x] para retornar a distância de ini até x
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement