Algoritmo linear de rotulagem de tempo para uma árvore?

12

Eu tenho uma árvore não direcionada cujos vértices eu quero rotular. Os nós das folhas devem ser rotulados como um. Então, assuma que as folhas foram removidas. Na árvore que resta, as folhas devem ser rotuladas como duas. Esse processo continua da maneira óbvia até que todos os vértices tenham um rótulo. A razão pela qual faço isso é que desejo armazenar os vértices em uma fila e passar por eles "sai primeiro". Existe uma maneira fácil de fazer esse tempo ?O(n+m)

Eu posso resolver o problema executando um BFS em cada etapa. Mas, na pior das hipóteses, em cada passo que passo em cada vértice, removo exatamente duas folhas e enfileirá-las. Eu acredito que isso leva tempo quadrático.

Outra idéia foi primeiro encontrar todas as folhas e depois fazer um BFS de cada folha. Isso não me dá a solução desejada. Por exemplo, considere um tipo de "gráfico da coroa", como na figura abaixo. A solução desejada é mostrada, mas o lançamento de um BFS de cada folha resultaria em apenas dois rótulos usados.

insira a descrição da imagem aqui

Idealmente, o algoritmo de tempo linear também seria fácil de explicar e implementar.

Bob Whiz
fonte

Respostas:

8

Árvores não enraizadas

Você pode usar uma fila de prioridade para resolver isso em :O(E+VlogV)

  • Coloque todos os vértices em uma fila de prioridade, com a prioridade sendo o grau.
  • Enquanto a fila não estiver vazia:
    • Remova um vértice de prioridade mínima, que deve ser 1 (ou 0 no final).v10
    • Seja , onde u passa por todos os vizinhos originais de v .σ(v)=1+maxσ(u)uv
    • Subtraia da prioridade do vizinho restante único de u (se houver).1u

De fato, não precisamos realmente de uma fila prioritária, e esse algoritmo pode ser implementado usando uma fila simples no tempo :O(E+V)

  • Inicialize uma matriz de comprimento com os graus de todos os vértices.V
  • Inicialize outra matriz de comprimento com "vivo".V
  • Passe uma vez pela primeira matriz e empurre todos os vértices do grau para uma fila.1
  • Enquanto a fila não estiver vazia:
    • Estourar um vértice .v
    • Seja , onde u passa por todos os vizinhos originais de v .σ(v)=1+maxσ(u)uv
    • Marque como "morto".v
    • Se tiver algum vizinho "vivo" u , subtraia 1 do grau de u .vu1u
    • Se o novo grau de for 1 , pressione u na fila.u1u

Árvores enraizadas

Use o DFS. Aqui está um esboço do algoritmo.

  • Dado um nó , se v for uma folha, defina d ( v ) = 1 .vvd(v)=1
  • Se não for uma folha, execute o algoritmo em todos os seus filhos e, em seguida, deixe d ( v ) = 1 + max d ( u ) , onde u passa sobre o conjunto de todos os filhos.vd(v)=1+maxd(u)u

Você executa esse algoritmo na raiz.

Yuval Filmus
fonte
Isto está certo? Considere a árvore 1-> 2-> 3-> 4-> 5, onde 1 é a raiz. 2 deve estar recebendo o rótulo 1, mas você dá 3? Ou por crianças você quer dizer vizinhos? Em qual nó iniciamos os dfs a partir de então?
Knoothe
Minha implementação é "desativada por uma", mas de acordo com a sua descrição, deve estar recebendo o rótulo 4 , pois é necessário remover 5 , depois 4 , depois 3 , e somente então 2 se torna uma folha. 245432
Yuval Filmus 27/03
Eu não fiz a pergunta :-). Eu interpretei a pergunta como sendo: uma árvore não direcionada. Rotule todas as folhas. Exclua-os. Recursar na árvore resultante. Nesse caso, a árvore é realmente 1-2-3-4-5, Etapa 1, você exclui 1 e 5, depois 2 e 4 e depois 3. Veja o parágrafo sobre "gráfico da coroa". Este é um dos algoritmos clássicos para encontrar o centro de uma árvore.
Knoothe
1 não é uma folha. Está muito longe de ser uma folha, é a raiz. Eu interpretei a pergunta como alvo de árvores enraizadas. Talvez devêssemos esperar o OP responder.
Yuval Filmus
2
@YuvalFilmus, só para colocar meus 2 centavos, não deveria ser ? As folhas são 1 ; se você as excluir, as novas folhas deverão ser 2 ; portanto, é uma medida de quantas camadas você deve excluir antes que o vértice se torne uma folha. Com min, qualquer vértice adjacente a uma folha recebe 2, mas pode não se tornar uma folha quando as folhas são excluídas. Essa frase tinha muitas folhas nela. Eu preciso de uma vassoura. 1+max{d(u)}12
Luke Mathieson
2

Uma resposta direta é a seguinte:

  • (u,v)uv

  • Classifique topologicamente o gráfico.

  • vv

O(n+m)O(n+m)

DW
fonte