Árvores Para Programação Competitiva
‹‹ 2022-08-02 ››
link da aula: https://leoriether.github.io/posts/trees
O que é uma árvore?
- Grafo com
N
nós eN-1
arestas - Conexo
- Existe um caminho único entre quaisquer dois vértices
Escolha dois.
Uma árvore pode ou não ter raíz. Se não tiver, é bem provável que a gente possa escolher uma raíz qualquer!
★ Subárvores#
DFS#
Muito útil para quando vc quer
- informação das subárvores pra calcular algo pro vértice, ou
- informação do caminho
raíz -> u
pra calcular algo prau
- por que no los dos? (acho que nunca vi problema que usa os dois ao mesmo tempo, mas fiquem de olho que eu posso settar um a qualquer momento)
- fazer basicamente qualquer coisa em árvore (basicamente suas duas únicas opções são DFS ou BFS)
vector<int> g[N];
void dfs(int u, int p = 0) {
for (int v : g[u]) if (v != p) {
dfs(v, u);
}
}
tamanho de subárvore: https://cses.fi/problemset/task/1674
DFS Time / Preorder Time / Euler Tour#
A única estrutura mais fácil que uma árvore é um array
Acho que o único jeito de explicar isso é fazendo uns exemplos? 🤔
★ Caminhos#
Lowest Common Ancestor (LCA)#
- O que é?
- Ideia: todo caminho entre
u
ev
em uma árvore pode ser dividido em dois caminhos:u -> LCA(u, v)
+v -> LCA(u, v)
Às vezes você só precisa saber que o LCA existe...#
Diâmetro#
Truque: transformar a árvore em binária
...mas outras vezes você precisa calculá-lo#
Problema: Q queries de encontrar a distância entre dois vértices
Binary lifting#
Problema facinho mas tricky do cses#
Problema Chefão: Empresa de Festas#
link: http://maratona.sbc.org.br/hist/2020/primfase20/maratona20.pdf
Dica
A gente pode resolver offline!Coisas que só vou falar se der tempo#
Resolver offline#
- Muitas vezes é mais fácil resolver um problema offline em árvore, porque podemos reaproveitar os resultados das subárvores para calcular o resultado de um nó!
- Outras vezes, você pode resolver offline mantendo uma estrutura de dados sobre
um caminho do pai até
u
Rerooting#
problema: https://cses.fi/problemset/task/1132
problema: https://cses.fi/problemset/task/1133/
Centroid Decomposition#
- Modo de decompor a árvore
- De forma parecida com o LCA, todo caminho entre dois vértices **em subárvores
★ Ler Mais#
- Small to Large / DSU on Tree / Sack
- Decomposição Heavy-Light
- 7th Litte Technique (nos comentários você encontra mais uns 2 ou 3 truques relacionados!)
- Árvores Link-Cut
- Virtual Trees