⚡
VITORLAB
>Home>Projects>Workbench>Blog
GitHubLinkedIn
status: building
>Home>Projects>Workbench>Blog
status: building

Connect

Let's build something together

Always interested in collaborations, interesting problems, and conversations about code, design, and everything in between.

send a signal→

Find me elsewhere

GitHub
@neuxxkk
LinkedIn
/in/vitornms
Email
vitornms@gmail.com
WhatsApp
+55 31 98415-2360
Forged with& code

© 2026 VITORLAB — All experiments reserved

back to blog
algorithms

Algoritmos de Grafos para Programacao Competitiva

BFS, DFS, Dijkstra e Kruskal implementados em Python e C. Preparacao para a OBI e competicoes de programacao.

VN

Vitor Neuenschwander

CS Student & Developer

Oct 5, 202415 min
#python#algorithms#graphs#competitive-programming#obi

Introducao

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.

BFS - Busca em Largura

Ideal para encontrar o menor caminho em grafos nao-ponderados:

from collections import deque

def 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

DFS - Busca em Profundidade

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

Dijkstra - Menor Caminho Ponderado

import heapq

def 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

Kruskal - Arvore Geradora Minima

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

Dicas para Competicoes

  • Pratique diariamente: Resolva ao menos 1 problema por dia
  • Domine as estruturas basicas: Fila, pilha, heap, union-find
  • Leia as restricoes: N <= 10^5 geralmente indica O(N log N)
  • Teste com casos extremos: Grafos vazios, um no, ciclos
  • Conclusao

    Esses quatro algoritmos cobrem a maioria dos problemas de grafos em competicoes. A chave e pratica e reconhecimento de padroes nos enunciados.

    share
    share:
    [RELATED_POSTS]

    Continue Reading

    ai

    Construindo uma Rede Neural do Zero em Python

    Implementacao de um perceptron multi-camada sem frameworks. Entendendo backpropagation, gradient descent e funcoes de ativacao na pratica.

    Nov 20, 2024•12 min
    backend

    Padroes de API REST com Django e DRF

    Boas praticas para construir APIs REST com Django Rest Framework. Serializers, viewsets, autenticacao e paginacao.

    Sep 12, 2024•11 min