Verifique se existe apenas um caminho simples no gráfico entre os nós x e y`


7

Digamos que demos um gráfico simples e não direcionado com nós e arestas bidirecionais. Para e , queremos verificar se no gráfico existe apenas um caminho simples entre eles.GNMxy

O que eu estava pensando era que deveríamos encontrar todos os ciclos no gráfico e executar bfs de a , se o caminho não se mover pelos vértices que estão em algum ciclo, haverá apenas um caminho e, caso contrário, haverá são mais.xy

Existe alguma outra maneira de verificar isso?



É uma pergunta semelhante, mas minha pergunta apenas pede para verificar se há apenas um ou mais.
— someone12321

@ Eugene Muito parecido, mas penso mais.
— Raphael

Respostas:


5

A sugestão de Rafael de usar o caminho mais curto 2 é correta, mas mais complexa do que o necessário.

Sua abordagem é inviável, o número de ciclos é fatorial no tamanho da entrada.

Aqui está um esboço de uma solução no tempo O(|V|+|E|).

Encontre um caminho p1 1,…pn de x para y no O(|V|+|E|). Se esse caminho não existir, respondaNÃO. Caso contrário, marque todos os nós no caminho. Esse caminho é realmente único se, e somente se, nenhum nó nesse caminho atingir um nó que vem depois dele. A partir do primeiro nó do caminhop1 1, escolha uma borda aleatória saindo de p1 1 diferente daquele que o conecta p2e inicie um DFS a partir daí. Se você alcançar um nó marcado, respondaNÃO, se você nunca alcançar um nó marcado, recorte esse ramo do gráfico e escolha outra aresta de saída aleatória. Continue de maneira semelhante até que todas as bordas de saída estejam esgotadas e comece novamente com o seguinte nó até chegarpn. Se você concluir o procedimento sem nunca responderNÃO, responda SIM. Todo o procedimento tem o custo de um DFS,O(|V|+|E|), portanto, o tempo total é O(|V|+|E|).


Quando você diz "cortar esse ramo do gráfico", você quer dizer remover todas as arestas que atravessou? O que realmente não seria feito de uma só vez no final do DFS; isso seria feito no caminho de volta "up" no próprio DFS. Direita? Compreendi isso com um pouco de reflexão, mas poderia ser explicado com mais clareza.
— Curinga

11
A quais das duas respostas de Rafael você está se referindo? Ah, provavelmente o que foi postado antes da sua resposta, e não o que foi postado depois. :-) Editado para esclarecer.
— David Richerby

@Wildcard: Sim, você realmente não "cortou" nada, escrevi assim porque senti que dava a ideia do que estava tentando fazer, mas em uma implementação real, presumo que você de alguma forma marcaria esses nós como visitados no próprio DFS.
— quicksort

2

Execute um algoritmo de caminho k-menor comk=2 e observe se falha.


3
Isso não é um exagero? A programação dinâmica resolve-o em O (| V | + | E |)
— quicksort

@ Quicksort Ahh, eu estendi a pergunta para ser sobre caminhos mais curtos na minha cabeça, desculpe. : D Por favor, adicione outra resposta!
— Raphael

2

Se existir um caminho da origem xpara algum ciclo, nem sempre contradiz a existência de um único caminho simples. Veja o seguinte exemplo: insira a descrição da imagem aqui

Aqui existe um ciclo que pode ser alcançado a partir de x e y. Este problema pode ser resolvido emO(|V|+|E|).

Você pode executar o BFS para encontrar a menor distância x para cada vértice no gráfico e o mesmo de y. Um nó pertence ao caminho mais curto dex para y se e apenas se

dEustumance(x,você)+dEustumance(você,y)=dEustumance(x,y)
Agora, para verificar se existe um único caminho, verifique se os nós válidos no caminho mais curto a cada distância ocorrem no máximo uma vez. Ou seja, se houver pelo menos dois nós que pertencem a um caminho mais curto dex para y com a mesma distância para xentão, há pelo menos dois caminhos mais curtos, caso contrário, ele é único. Você pode fazer todo o pós-processamento emO(|V|).

Olha, nós não queremos ter se existem dois caminhos mesma distância, mas apenas para verificar se há dois caminhos diferentes
— someone12321

Entendi, não sei por que pensei que ambos os caminhos são de tamanho mínimo. Enfim, espero que você ache útil o exemplo acima, ele ainda é válido.
— Marcelo Fornet

0

Realize uma pesquisa profunda a partir de xe anote as arestas de acordo com a arvore, a traseira ou a cruz (veja, por exemplo, aqui ).

Há mais de um caminho simples de x para y se e somente se houver (pelo menos) um nó no caminho de x para y usando apenas arestas de árvore (ou seja, o caminho encontrado pelo DFS) que é incidente em uma aresta traseira ou transversal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.