Contar todos os caminhos possíveis, ou todos os caminhos possíveis com um determinado comprimento, entre dois nós em um gráfico direcionado ou não direcionado é um problema clássico. Atenção deve ser dada a todos os meios, devido aos ciclos possíveis.
Esta questão é um pouco diferente, ou pelo menos eu acho.
ENTRADA: Seja G um gráfico direcionado. G pode ter ciclos e também nós auto-conectados. Seja A (G) a matriz de adjacência de G (com 1 em G i, j se houver um link que vá de i a j e a 0 em caso contrário). Defina T e B dois subconjuntos de nós de G , possivelmente com interseção nula.
RESULTADO: A lista de todos os caminhos de comprimento , no máximo k indo de um nó no T em um nó B . Os caminhos podem conter várias vezes as mesmas arestas, desde que passem do nó de origem para o nó de destino em etapas estritamente inferiores a k + 1.
PERGUNTA: Gostaria de saber qual algoritmo tem melhor desempenho nesta tarefa. Estou tentando desenvolver uma resposta possível com base no fato de que o n-ésimo poder da matriz de adjacência, se computado simbolicamente (com uma variável diferente para cada entrada em vez de 1), mantém traços de todos esses caminhos (e reduz à contagem de caminhos se computado numericamente com 1 nas entradas). Mas eu realmente não sei se essa é a maneira mais rápida de fazer a tarefa (provavelmente não).
CAVEAT: Não estou pedindo o problema da contagem, nem os caminhos mais curtos, o comprimento de um caminho é definido como o número de bordas usadas (contando a repetição). Estou usando R, mas se você preferir, pense sobre isso em qualquer outro idioma! Sinto muito se a questão já foi colocada e resolvida. Obrigado pela ajuda!
informações adicionais: Tentei uma abordagem de séries de potências matriciais (A ^ 3 fornece todos os três caminhos longos, ...) e dfs / bfs. Eu acho que os dois últimos estão longe da otimização, pois não levam em conta que eu estou trabalhando em conjuntos de fontes e destinos e, portanto, faço muito trabalho redundante ...
Respostas:
Se não estiver faltando algo sobre sua pergunta, você poderá aplicar o truque padrão para reduzir a pergunta sobre várias origens e destinos ao caso de origem única e destino único:
Após essa redução, estamos na configuração padrão de perguntas com dois vértices extras e queremos encontrar caminhadas de a de comprimento no máximo .s t s t k+2
fonte