01
Relações
Uma relação entre dois conjuntos é só uma forma de dizer
quais pares combinam. Formalmente, é um subconjunto do
produto cartesiano: R ⊆ V × V. Não
precisa ter número, nem regra de cálculo: basta decidir, para
cada par, se ele está ou não na relação.
Na vila usamos a relação de adjacência: dois lugares estão
relacionados quando existe uma passagem direta entre eles.
a R b ⇔ existe aresta {a, b} ∈ E
02
Funções
Uma função é uma relação com uma exigência a mais:
cada elemento do domínio tem exatamente uma saída. Se a
mesma entrada pudesse dar dois resultados, não seria função.
No grafo, a função de peso recebe uma aresta e devolve o custo de
atravessá-la. Toda aresta tem um único peso, então é função. Mas
arestas diferentes podem ter o mesmo peso, então ela não é
injetora.
w : E → ℕ · w({B, P}) = 2
03
Grafos
Um grafo junta dois conjuntos: vértices (os pontos) e
arestas (as ligações). Quando cada aresta tem um número,
o grafo é ponderado. Se a ligação vale nos dois sentidos,
ele é não direcionado.
Um caminho é uma sequência de vértices ligados por
arestas, e o seu custo é a soma dos pesos. O grafo não é um mapa
em escala: só importa quem se liga com quem, e com qual peso.
G = (V, E, w) · |V| = 10, |E| = 20
04
Dijkstra
É um algoritmo guloso para achar o menor custo a partir de uma
origem. Ele mantém uma distância provisória para cada lugar e,
a cada rodada, fecha o lugar não visitado mais barato,
usando-o para tentar baratear os vizinhos (isso se chama
relaxar uma aresta).
Ele só é correto com pesos não negativos: se nenhum trecho pode
diminuir o custo, quem foi fechado com o menor valor nunca mais
será superado.
d(v) ← min( d(v), d(u) + w({u, v}) )