3

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:
enter image description here

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 
} 
+0

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

+0

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

+0

@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

Répondre

0

Vous pouvez utiliser cet algorithme sur un arbre binaire pour imprimer tous ses chemins racine à feuilles. La fonction treePaths parcourt les nœuds en profondeur (DFS), en pré-commande, récursivement.

treePaths(root, path[1000], 0) // initial call, 1000 is a path length limit 

// treePaths traverses nodes of tree DFS, pre-order, recursively 
treePaths(node, path[], pathLen) 
    1) If node is not NULL then 
     a) push data to path array: 
      path[pathLen] = node->data. 
     b) increment pathLen 
      pathLen++ 
    2) If node is a leaf node, then print the path array, from 0 to pathLen-1 
    3) Else 
     a) Call treePaths for left subtree 
      treePaths(node->left, path, pathLen) 
     b) Call treePaths for right subtree. 
      treePaths(node->right, path, pathLen) 
0

Juste fois le résultat et compte les nouvelles possibilités: Résultat = 9 (vous forgott le chemin [1])

n0 n1 n2 n3 
1, 2, 4,  +3 
    (2), 5,  +1 
    (2), 6,  +1 
    (2),   +0 
(1), 3, 7, 8, +3 
     (7), 9 +1 
+0

Je me demande comment le feriez-vous? Je peux voir que mon retour actuel a tout ce dont j'ai besoin, mais je ne peux pas le diviser. – cojoj