-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbellman-ford.py
More file actions
58 lines (38 loc) · 1.71 KB
/
bellman-ford.py
File metadata and controls
58 lines (38 loc) · 1.71 KB
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
#------COMPLEXIDADE-------
#O(VE) V == vértices e E == arestas
#Naive implementation
INF = 1e12
n,m = map(int,input().split())
e = []
for x in range(m):
a,b,c = map(int,input().split())
e.append((a,b,c))
def bellman_ford(v):
distancia = [INF] * n
distancia[v] = 0
for i in range(n-1): #Fase atual. Ele vai percorrer o grafo repetidas vezes para otimizar as distancias
for j in range(m):# Nó atual
if distancia[e[j][0]] < INF: #Se a distancia de nó inicial V até o nó atual for menor que infinito.
#Então a distancia do nó atual até o nó destino será igual ao minimo entre a
#distancia do nó atual até o destino e a distancia do nó V até o nó atual
# mais a distancia global do nó destino
#É basicamente um dijsktra + BFS só muda a formatação da lista adjacente
distancia[e[j][1]] = min (distancia[e[j][1]], distancia[e[j][0]] + e[j][2])
return distancia
print(bellman_ford(0))
#Faster implementation
#Basicamente a diferença é que ele manda parar de percorrer quando nenhuma distancia muda
#Já que se nenhuma distancia mudar significa que já encontrou todas as menores distâncias
#A complexidade não muda mas acelerar em good e average cases.
def bellman_ford_otimizado(v):
distancia = [INF] * n
distancia[v] = 0
while True:
qualquer = False
for j in range(m):
if distancia[e[j][0] < INF:
if distancia[e[j][1] > distancia[e[j][0]] + e[j][2]:
distancia[e[j][1] = disntancia[e[j][0] + e[j][2]
qualquer = True
if qualquer is False:
return d