Esse link fornece um algoritmo para encontrar o diâmetro de uma árvore não direcionada usando BFS / DFS . Resumindo:
Execute o BFS em qualquer nó s no gráfico, lembrando o nó que você descobriu por último. Execute o BFS u lembrando o nó v descoberto pela última vez. d (u, v) é o diâmetro da árvore.
Por que isso funciona?
A página 2 disso fornece um raciocínio, mas é confuso. Estou citando a parte inicial da prova:
Execute o BFS em qualquer nó s no gráfico, lembrando o nó que você descobriu por último. Execute o BFS u lembrando o nó v descoberto pela última vez. d (u, v) é o diâmetro da árvore.
Correção: Seja a e b quaisquer dois nós, de modo que d (a, b) seja o diâmetro da árvore. Há um caminho único de a para b. Seja o primeiro nó nesse caminho descoberto pelo BFS. Se os caminhos de s a u e de a a b não compartilham arestas, o caminho de t a u inclui s. tão
.... (mais desigualdades seguem ..)
As desigualdades não fazem sentido para mim.
Respostas:
Todas as partes da prova da reivindicação dependem de 2 propriedades cruciais de árvores com bordas não direcionadas:
Escolha um nó de árvore arbitrário . Suponha que u , v ∈ V ( G ) são nós com d ( u , v ) = d i a m ( G ) . Suponha ainda que o algoritmo encontre um nó x iniciando em s primeiro, algum nó y iniciando em x próximo. wlog d ( s , u ) ≥ d ( s , v ) . Observe ques u,v∈V(G) d(u,v)=diam(G) x s y x d(s,u)≥d(s,v) deve permanecer, a menos que o primeiro estágio do algoritmo não termine em x . Veremos que d ( x , y ) = d ( u , v ) .d(s,x)≥d(s,y) x d(x,y)=d(u,v)
A configuração mais geral de todos os nós envolvidos pode ser vista nos pseudo gráficos a seguir (possivelmente ou s = z x y ou ambos):s=zuv s=zxy
nós sabemos isso:
1) e 2) implicam .d(u,v)=d(zuv,v)+d(zuv,u)≥d(zuv,x)+d(zuv,y)=d(x,y)+2d(zuv,zxy)≥d(x,y)
3) e 4) implicamd(zxy,y)+d(s,zxy)+d(zxy,x)≥d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy) equivalente a .d(x,y)=d(zxy,y)+d(zxy,x)≥2∗d(s,zuv)+d(v,zuv)+d(u,zuv)≥d(u,v)
portanto .d(u,v)=d(x,y)
provas analógicas valem para configurações alternativas
e
essas são todas as configurações possíveis. em particular, devido ao resultado do estágio 1 do algoritmo e y ∉ p a t h ( x , u ) , y A p a t h ( x , v ) devido ao estágio 2.x∉path(s,u),x∉path(s,v) y∉path(x,u),y∉path(x,v)
fonte
A intuição por trás é muito fácil de entender. Suponha que eu tenha que encontrar o caminho mais longo que exista entre dois nós na árvore especificada.
Após desenhar alguns diagramas, podemos observar que o caminho mais longo sempre ocorrerá entre dois nós de folha (nós com apenas uma aresta vinculada). Isso também pode ser comprovado pela contradição de que, se o caminho mais longo estiver entre dois nós e um ou ambos os nós não for um nó folha, podemos estender o caminho para obter um caminho mais longo.
Portanto, uma maneira é primeiro verificar quais nós são nós folha e iniciar o BFS a partir de um dos nós folha para obter o nó mais distante dele.
Em vez de primeiro descobrir quais nós são nós de folha, iniciamos o BFS a partir de um nó aleatório e, em seguida, vemos qual nó está mais distante dele. Deixe o nó mais distante seja x. É claro que x é um nó folha. Agora, se iniciarmos o BFS a partir de x e verificar o nó mais distante, obteremos nossa resposta.
Mas qual é a garantia de que x será o ponto final de um caminho máximo?
Vamos ver por um exemplo: -
Suponha que eu iniciei meu BFS a partir de 6. O nó na distância máxima de 6 é o nó 7. Usando o BFS, podemos obter esse nó. Agora, estrelamos o BFS no nó 7 para obter o nó 9 à distância máxima. O caminho do nó 7 ao nó 9 é claramente o caminho mais longo.
E se o BFS iniciado no nó 6 fornecesse 2 como o nó na distância máxima. Então, quando obtermos BFS de 2, obteremos 7 como nó na distância máxima e o caminho mais longo será 2-> 1-> 4-> 5-> 7 com comprimento 4. Mas o comprimento do caminho mais longo real é 5. Isso não pode acontece porque o BFS do nó 6 nunca dará o nó 2 como nó na distância máxima.
Espero que ajude.
fonte
Aqui está uma prova que segue o conjunto de soluções MIT vinculado mais detalhadamente à pergunta original. Para maior clareza, usarei a mesma notação usada para que a comparação possa ser feita com mais facilidade.
fonte
Primeiro, execute um DFS a partir de um nó aleatório e, em seguida, o diâmetro de uma árvore é o caminho entre as folhas mais profundas de um nó em sua subárvore DFS:
fonte
Pela definição de BFS, a distância (a partir do nó inicial) de cada nó explorado é igual à distância do nó anterior explorado ou superior a 1. Portanto, o último nó explorado pelo BFS estará entre os mais distantes desde o início nó.
fonte
Uma coisa importante a saber é que uma árvore é sempre plana, o que significa que ela pode ser projetada em um plano, e muitas vezes o pensamento bidimensional comum funciona. Nesse caso, o algoritmo diz que, começando em qualquer lugar, vá o mais longe possível. A distância desse ponto até onde você pode se afastar é a maior distância na árvore e, portanto, o diâmetro.
Esse método também funcionaria para encontrar o diâmetro de uma ilha física real se o definíssemos como o diâmetro do menor círculo que envolveria completamente a ilha.
fonte
@op, a maneira como os casos são definidos no PDF pode ser um pouco complicada.
Eu acho que os dois casos devem ser:
O restante da prova no PDF deve seguir.
Com essa definição, a figura mostrada pelo OP se enquadra no caso 2.
fonte