Je cherche un algorithme qui m'aidera à trouver tous les chemins possibles dans un graphique. Tout ce que j'ai trouvé jusqu'à présent n'est pas entièrement satisfaisant.Trouver tous les chemins possibles dans le graphique
Imaginons que nous avons un graphique (arbre) comme celui-ci:
Et nous allons utiliser un algorithme comme en largeur Recherche ou Profondeur Première recherche. En retour, nous allons obtenir quelque chose comme
1, 2, 4, (2), 5, (2), 6, (2), (1), 3, 7, 8, (7), 9
Quelle est la façon dont nous traversons cet arbre et ce n'est pas ce que je cherche. J'aimerais obtenir tous chemins, comme:
1
1, 2
1, 2, 4
1, 2, 5
1, 2, 6
1, 3
1, 3, 7
1, 3, 7, 8
1, 3, 7, 9
La chose est que je veux juste préciser noeud root
et algorithme devrait être en mesure de me fournir tous les chemins possibles de toute longueur.
Jusqu'à présent, le code simple je ressemble:
func dfs(_ graph: Graph, source: Node) -> [String] {
var nodesExplored = [source.label]
source.visited = true
for edge in source.neighbors {
if !edge.neighbor.visited {
nodesExplored += dfs(graph, source: edge.neighbor)
}
}
return nodesExplored
}
Comme vous avez écrit BFS ou DFS sont la voie à suivre, avec un mineur modification de la mise à jour des chemins à chaque étape et s'assurer que vous n'ajoutez pas le même chemin plus d'une fois (vous pouvez utiliser un * Set * pour accumuler les objets Path). – alfasin
Eh bien, tous les chemins dans un graphe non orienté ou cyclique sont un ensemble infini. Et si vous recherchez réellement un algorithme pour la recherche dans un arbre, vous devriez probablement demander explicitement un tel algorithme dans votre question plutôt que généralement pour les arbres. – Paul
@Paul cette chose est un arbre, mais il est possible dans mon cas d'avoir des cycles. Par exemple, nous pouvons avoir le bord entre les nœuds 2 et 3. – cojoj