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?

someone12321
fonte
11
Possível duplicada cs.stackexchange.com/questions/3078/…
Eugene
É 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|).

ordenação rápida
fonte
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.

Rafael
fonte
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|).
Marcelo Fornet
fonte
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.

Rafael
fonte