forked from TamaWilson/dijkstra_python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdj.py
More file actions
99 lines (74 loc) · 3.12 KB
/
Copy pathdj.py
File metadata and controls
99 lines (74 loc) · 3.12 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
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
91
92
93
94
95
96
97
98
99
grafo = { "A" : { "B" : 1, "C":2 },
"B" : { "D":2, "E":4 },
"C" : { "E":2 },
"D" : { "F": 6 },
"E" : { "F": 7 },
"F" : { }
}
grafo2 = { "D" : { "A": 4, "H": 1 },
"A" : { "H": 10, "E": 1 },
"H" : { "E": 5, "I": 9 },
"E" : { "F" : 3 },
"I" : { "J" : 2 },
"F" : { "I" : 1, "G": 7, "B": 1, "C": 3 },
"G" : { },
"J" : { "G" : 1 },
"B" : { "C" : 2 },
"C" : { } }
def dijkstra(grafo, origem): #retorna a menor distancia de um dado nó para todos os outros possíveis.
controle = { }
distanciaAtual = { }
noAtual = { }
naoVisitados = []
atual = origem
noAtual[atual] = 0
for vertice in grafo.keys():
naoVisitados.append(vertice) #inclui os vertices nos não visitados
distanciaAtual[vertice] = float('inf') #inicia os vertices como infinito
distanciaAtual[atual] =0
naoVisitados.remove(atual)
while naoVisitados:
for vizinho, peso in grafo[atual].items():
pesoCalc = peso + noAtual[atual]
if distanciaAtual[vizinho] == float("inf") or distanciaAtual[vizinho] > pesoCalc:
distanciaAtual[vizinho] = pesoCalc
controle[vizinho] = distanciaAtual[vizinho]
if controle == {} : break
minVizinho = min(controle.items(), key=lambda x: x[1]) #seleciona o menor vizinho
atual=minVizinho[0]
noAtual[atual] = minVizinho[1]
naoVisitados.remove(atual)
del controle[atual]
print(distanciaAtual)
def dijkstra_path(grafo, origem, fim): #retorna a menor distancia de um No origem até um No destino e o caminho até ele
controle = { }
distanciaAtual = { }
noAtual = { }
naoVisitados = []
atual = origem
noAtual[atual] = 0
for vertice in grafo.keys():
naoVisitados.append(vertice) #inclui os vertices nos não visitados
distanciaAtual[vertice] = float('inf') #inicia os vertices como infinito
distanciaAtual[atual] = [0,origem]
naoVisitados.remove(atual)
while naoVisitados:
for vizinho, peso in grafo[atual].items():
pesoCalc = peso + noAtual[atual]
if distanciaAtual[vizinho] == float("inf") or distanciaAtual[vizinho][0] > pesoCalc:
distanciaAtual[vizinho] = [pesoCalc,atual]
controle[vizinho] = pesoCalc
print(controle)
if controle == {} : break
minVizinho = min(controle.items(), key=lambda x: x[1]) #seleciona o menor vizinho
atual=minVizinho[0]
noAtual[atual] = minVizinho[1]
naoVisitados.remove(atual)
del controle[atual]
print("A menor distância de %s atá %s é: %s" % (origem, fim, distanciaAtual[fim][0]))
print("O menor caminho é: %s" % printPath(distanciaAtual,origem, fim))
def printPath(distancias,inicio, fim):
if fim != inicio:
return "%s -- > %s" % (printPath(distancias,inicio, distancias[fim][1]),fim)
else:
return inicio