Quelqu'un peut - il me suggérer un algorithme linéaire qui prend en entrée un graphe orienté acyclique et deux sommets et et retourne le nombre de chemins simples de à dans .
J'ai un algorithme dans lequel je vais lancer un DFS (recherche approfondie d'abord) mais si DFS trouve il ne changera pas la couleur (du blanc au gris) des nœuds qui dans le chemin sorte que si c'est le sous-chemin d'un autre chemin, alors DFS le répète également. Par exemple, considérons la liste de contiguïté où nous devons trouver le nombre de chemins de p à v .
Mon algorithme est-il correct? sinon, quelles modifications sont nécessaires pour le corriger ou toute autre approche sera grandement appréciée.
Remarque : Ici, j'ai considéré l'algorithme DFS qui est donné dans le livre "Introduction aux algorithmes de Cormen" dans lequel il colore les nœuds en fonction de son statut. Ainsi, si le nœud est non visité, non exploré et exploré, sa couleur sera blanche, gris et noir respectivement.Toutes les autres choses sont standard.
la source
Réponses:
Votre implémentation actuelle calculera le nombre correct de chemins dans un DAG. Cependant, en ne marquant pas les chemins, cela prendra un temps exponentiel. Par exemple, dans l'illustration ci-dessous, chaque étape du DAG augmente le nombre total de chemins d'un multiple de 3. Cette croissance exponentielle peut être gérée avec une programmation dynamique.
Le nombre de - dans un DAG est calculé par la récurrence,s t
Une simple modification de DFS calculera cette donnée comme
Il n’est pas difficile de voir que chaque bord est regardé une seule fois, d’où un temps d’exécution de .O(V+E)
la source
Vous devez seulement noter que le nombre de chemins d'un nœud au nœud cible est la somme du nombre de chemins de ses enfants à la cible. Vous savez que cet algorithme va toujours s'arrêter car votre graphique n'a pas de cycles.
Désormais, si vous enregistrez le nombre de chemins d'un nœud à la cible lors de la visite des nœuds, la complexité temporelle devient linéaire en nombre de sommets et la mémoire en linéaire en nombre de nœuds.
la source
Le nombre de chemins entre deux sommets quelconques dans un DAG peut être trouvé à l'aide de la représentation de la matrice d'adjacence.
Supposons que A soit la matrice d'adjacence de G. Prendre la Kth de la puissance de A après y avoir ajouté la matrice d'identité donne le nombre de chemins de longueur <= K.
Puisque la longueur maximale de tout chemin simple dans un DAG est | V | -1, le calcul de la puissance de | V | -1 donnerait le nombre de chemins entre toutes les paires de sommets.
Calculer | V | -1 ème puissance peut être fait en effectuant log (| V | -1) muliplications chacune de TC: | V | ^ 2.
la source