Skip to content

Commit e17892e

Browse files
committed
Merge branch 'main' into bfs_dfs_python
2 parents e3d6043 + 9d0d81c commit e17892e

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

.github/workflows/action.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: Check Markdown links
22

3-
on: push
3+
on: [push, pull_request]
44

55
jobs:
66
markdown-link-check:

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
66

77
| Algoritmos | C/C++ | Java | Python | Go | Ruby | JS | Pascal | Swift | Rust |
88
|-------------------------------------|-------|------|--------|----|------|----|--------|-------|------|
9-
| [Algoritmo Dijkstra][1] | [C/C++](./src/c/AlgoritmoDijkstra.c) | Java | Python | [Go](./src/go/dijkstra/dijkstra.go) | Ruby | [JS](src/javascript/AlgoritmoDijkstra.js) | Pascal | Swift | Rust |
9+
| [Algoritmo Dijkstra][1] | [C/C++](./src/c/AlgoritmoDijkstra.c) | Java | [Python](./src/python/dijkstra.py) | [Go](./src/go/dijkstra/dijkstra.go) | Ruby | [JS](src/javascript/AlgoritmoDijkstra.js) | Pascal | Swift | Rust |
1010
| [Algoritmo Floyd Warshall][2] | [C/C++](./src/c/AlgoritmoFloydWarshall.c) | Java | Python | Go | Ruby | JS | Pascal | Swift | Rust |
1111
| [Busca Binária][5] | [C/C++](./src/c/BinarySearch.cpp) | Java | [Python](./src/python/busca_binaria.py) | Go | [Ruby](./src/ruby/BuscaBinaria.rb) | [JS](./src/javascript/BinarySearch.js) | [Pascal](./src/pascal/busca-binaria.pas) | Swift | Rust |
1212
| [Busca em Grafos][6] | [C/C++](./src/c/BuscaEmGrafo.c) | Java | [Python](.src/python/busca_em_grafo.py) | Go | Ruby | [JS](./src/javascript/GraphSearch.js) | Pascal | Swift | Rust |

src/python/dijkstra.py

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Grafos - Algoritmos de Dijkstra em Python
2+
# Bruno Dantas de Paiva - 2021
3+
# https://github.com/DantasB
4+
5+
import heapq
6+
7+
8+
class Grafo():
9+
"""Define um grafo utilizando matriz de adjacências.
10+
11+
Args:
12+
arestas (list): uma lista de listas onde o indice é o
13+
vértice e cada elemento da lista é o vizinho
14+
"""
15+
16+
def __init__(self, arestas: list):
17+
self.adj = [[] for _ in range(len(arestas))]
18+
self.dist = [99999 for _ in range(len(arestas))]
19+
self.adiciona_arestas(arestas)
20+
21+
def adiciona_arestas(self, arestas: list) -> None:
22+
"""Adiciona todas as arestas ao grafo
23+
24+
Args:
25+
arestas (list): a lista contendo todas as definições de arestas do grafo
26+
"""
27+
for i in range(len(arestas)):
28+
for j in range(len(arestas[i])):
29+
self.__adiciona_aresta(i, arestas[i][j])
30+
31+
def __adiciona_aresta(self, u: int, v: int) -> None:
32+
"""Adiciona a aresta na matriz de adjacência
33+
34+
Args:
35+
u (int): vértice u
36+
v (int): vértice v
37+
"""
38+
if v[0] not in self.adj[u]:
39+
self.adj[u].append([v[1], v[0]])
40+
41+
def _peso_entre_u_e_v(self, u: int, v: int) -> float:
42+
"""Retorna o peso entre os vértices u e v
43+
44+
Args:
45+
u (int): vértice u
46+
v (int): vértice v
47+
48+
Returns:
49+
float: peso entre u e v
50+
"""
51+
for vertice in self.adj[v[1]]:
52+
if vertice[1] == u:
53+
return vertice[0]
54+
55+
def dijkstra(self, start: int) -> list:
56+
"""Retorna a lista de distância do vértice start até todos os vértices
57+
58+
Args:
59+
start (int): vértice inicial
60+
61+
Returns:
62+
list: lista de distâncias
63+
"""
64+
distancia = self.dist.copy()
65+
S = set() # Conjunto de vértices explorados
66+
distancia[start] = 0
67+
68+
while True:
69+
V = set([(i, distancia[i]) for i in range(len(self.adj))])
70+
diferenca_de_conjuntos = list(V.difference(S))
71+
if not diferenca_de_conjuntos:
72+
break
73+
74+
heapq.heapify(diferenca_de_conjuntos)
75+
u, distancia_u = heapq.heappop(diferenca_de_conjuntos)
76+
77+
S.add((u, distancia[u]))
78+
for v in self.adj[u]:
79+
if distancia[v[1]] > distancia_u + self._peso_entre_u_e_v(u, v):
80+
distancia[v[1]] = distancia_u + \
81+
self._peso_entre_u_e_v(u, v)
82+
83+
return distancia
84+
85+
86+
arestas = [[[1, 1], [2, 0.3], [5, 0.2]], # Vizinhos do vértice 0.
87+
[[0, 1], [2, 0.5]], # Vizinhos do vértice 1.
88+
[[0, 0.3], [1, 0.5], [3, 1.5], [4, 2]], # Vizinhos do vértice 2.
89+
[[2, 1.5], [4, 1.3], [5, 0.8]], # Vizinhos do vértice 3.
90+
[[2, 2], [3, 1.3]], # Vizinhos do vértice 4.
91+
[[0, 0.2], [3, 0.8]] # Vizinhos do vértice 5.
92+
]
93+
94+
grafo = Grafo(arestas)
95+
print(grafo.dijkstra(0))

0 commit comments

Comments
 (0)