BFS, DFS, Dijkstra e Kruskal implementados em Python e C. Preparacao para a OBI e competicoes de programacao.
Vitor Neuenschwander
CS Student & Developer
Grafos sao uma das estruturas de dados mais importantes em competicoes de programacao. Dominar os algoritmos classicos e essencial para resolver problemas da OBI e outras competicoes.
Ideal para encontrar o menor caminho em grafos nao-ponderados:
from collections import dequedef bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
distances = {start: 0}
while queue:
node = queue.popleft()
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
distances[neighbor] = distances[node] + 1
queue.append(neighbor)
return distances
Util para detectar ciclos e ordenacao topologica:
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
return visited
import heapqdef dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
pq = [(0, start)]
while pq:
dist, node = heapq.heappop(pq)
if dist > distances[node]:
continue
for neighbor, weight in graph[node]:
new_dist = dist + weight
if new_dist < distances[neighbor]:
distances[neighbor] = new_dist
heapq.heappush(pq, (new_dist, neighbor))
return distances
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
px, py = self.find(x), self.find(y)
if px == py:
return False
if self.rank[px] < self.rank[py]:
px, py = py, px
self.parent[py] = px
if self.rank[px] == self.rank[py]:
self.rank[px] += 1
return True
def kruskal(n, edges):
edges.sort(key=lambda e: e[2])
uf = UnionFind(n)
mst = []
for u, v, w in edges:
if uf.union(u, v):
mst.append((u, v, w))
return mst
Esses quatro algoritmos cobrem a maioria dos problemas de grafos em competicoes. A chave e pratica e reconhecimento de padroes nos enunciados.
Implementacao de um perceptron multi-camada sem frameworks. Entendendo backpropagation, gradient descent e funcoes de ativacao na pratica.
Boas praticas para construir APIs REST com Django Rest Framework. Serializers, viewsets, autenticacao e paginacao.