Alguém pode sugerir-me um algoritmo de tempo linear, que recebe como entrada um dirigido acíclico gráfico e dois vértices e e devolve o número de caminhos simples de a em .
Eu tenho um algoritmo no qual executarei um DFS (Depth First Search), mas se o DFS encontrar , ele não mudará a cor (de branco para cinza) de qualquer um dos nós que no caminho para que se esse for o subcaminho de qualquer outro caminho, o DFS também o percorrerá novamente. Por exemplo, considere a lista de adjacências em que precisamos encontrar o número de caminhos de p a v .
Meu algoritmo está correto? caso contrário, quais modificações são necessárias para torná-lo correto ou quaisquer outras abordagens serão muito apreciadas.
Nota : Aqui eu considerei o algoritmo DFS que é fornecido no livro "Introdução aos algoritmos por Cormen", no qual ele colore os nós de acordo com seu status. Portanto, se o nó não for visitado, inexplorado e explorado, a cor será branca cinza e preto, respectivamente. Todas as outras coisas são padrão.
fonte
Respostas:
Sua implementação atual calculará o número correto de caminhos em um DAG. No entanto, ao não marcar caminhos, levará um tempo exponencial. Por exemplo, na ilustração abaixo, cada estágio do DAG aumenta o número total de caminhos em um múltiplo de 3. Esse crescimento exponencial pode ser tratado com programação dinâmica.
A computação do número de caminhos - em um DAG é dada pela recorrência, t Caminhos ( u ) = { 1 se u = t ∑ ( u , v ) ∈ E Caminhos ( v ) caso contrário.s t
Uma simples modificação do DFS calculará isso como
Não é difícil ver que cada aresta é vista apenas uma vez, portanto, um tempo de execução de .O(V+E)
fonte
Você só precisa observar que o número de caminhos de um nó para o nó de destino é a soma do número de caminhos de seus filhos para o destino. Você sabe que esse algoritmo sempre para porque seu gráfico não possui ciclos.
Agora, se você salvar o número de caminhos de um nó no destino ao visitar os nós, a complexidade do tempo se tornará linear no número de vértices e a memória linear no número de nós.
fonte
O número de caminhos entre dois vértices em um DAG pode ser encontrado usando a representação da matriz de adjacência.
Suponha que A é a matriz de adjacência de G. Tomando o poder K de A depois de adicionar a matriz de identidade, fornece o número de caminhos de comprimento <= K.
Como o comprimento máximo de qualquer caminho simples em um DAG é | V | -1, o cálculo de | V | -1ª potência forneceria o número de caminhos entre todos os pares de vértices.
O cálculo da | V | -1ª potência pode ser feito executando multiplicações de log (| V | -1) cada um dos TC: | V | ^ 2.
fonte