-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrafo.py
90 lines (69 loc) Β· 2.64 KB
/
grafo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class Grafo:
def __init__(self, drigido = False, vertices = []):
self.dirigido = drigido
self.vertices = {}
if len(vertices) != 0:
for vertice in vertices:
self.vertices[vertice]= {}
def agregar_vertice(self,v):
if v in self.vertices:
raise ValueError(f"ya existe este vertice en el grafo.")
self.vertices[v] = {}
def eliminar_vertice(self,v):
if v not in self.vertices:
raise ValueError(f"No esta el vertice en el grafo.")
self.vertices.pop(v)
for adyacentes in self.vertices.values():
for vertice in adyacentes.keys():
if vertice==v:
adyacentes.pop(v)
def obtener_vertices(self):
res = []
for v in self.vertices.keys():
res.append(v)
return res
def agregar_arista(self,v,w,p = 1):
if v not in self.vertices or w not in self.vertices:
raise ValueError(f"vertice/s no esta en el grafo")
if w in self.vertices[v]:
raise ValueError(f"ya esta la arista en el grafo")
self.vertices[v][w] = p
if not self.dirigido:
self.vertices[w][v] = p
def eliminar_arista(self,v,w,p = 1):
if v not in self.vertices or w not in self.vertices:
raise ValueError(f"vertice/s no esta en el grafo")
if w not in self.obtener_vertices[v]:
raise ValueError(f"Arista inexistente en el grafo")
#revisar esta parte:
self.vertices[v].pop(w)
if not self.dirigido:
self.vertices[w].pop(v)
def estan_unidos(self,v,w):
if v not in self.vertices or w not in self.vertices:
return False
if w not in self.obtener_vertices[v]:
return False
return True
def peso_arista(self,v,w):
if not self.estan_unidos(v,w):
raise ValueError(f"v no tiene como adyacente a w; o no existen en el grafo")
return self.vertices[v][w]
def vertice_aleatorio(self):
return self.vertices[0]
def adyacentes(self,v):
res = []
for w in self.vertices[v].keys():
res.append(w)
return res
def aristas(self):
visitados = set()
aristas = []
for v in self.vertices.keys():
if v not in visitados:
visitados.add(v)
for w in self.vertices.values():
if w not in visitados:
aristas.append((v,w,self.peso_arista(v,w)))
visitados.add(w)
return aristas