Python: comment trouver si un chemin existe entre 2 nœuds dans un graphique?

StackOverflow https://stackoverflow.com/questions/2353768

  •  23-09-2019
  •  | 
  •  

Question

J'utilise un package NetworkX de Python.

Était-ce utile?

La solution

>>> import networkx as nx
>>> G=nx.empty_graph()
>>> G.add_edge(1,2)
>>> G.add_edge(2,3)
>>> G.add_edge(4,5)
>>> nx.path.bidirectional_dijkstra(G,1,2)
(1, [1, 2])
>>> nx.path.bidirectional_dijkstra(G,1,3)
(2, [1, 2, 3])
>>> nx.path.bidirectional_dijkstra(G,1,4)
False
>>> nx.path.bidirectional_dijkstra(G,1,5)
False
>>> 

Vous pouvez également utiliser le résultat comme valeur booléenne

>>> if nx.path.bidirectional_dijkstra(G,1,2): print "path exists"
... 
path exists
>>> if nx.path.bidirectional_dijkstra(G,1,4): print "path exists"
... 
>>> 

Autres conseils

Pour vérifier s'il y a un chemin entre deux nœuds dans un graphique -

>>> import networkx as nx
>>> G=nx.Graph()
>>> G.add_edge(1,2)
>>> G.add_edge(2,3)
>>> nx.has_path(G,1,3)
True
>>> G.add_edge(4,5)
>>> nx.has_path(G,1,5)
False

Pour plus d'informations, veuillez vous référer Has_path - Documentation Networkx 1.7

Utilisation d'une structure de données définie disjointe:

Créez un ensemble de singleton pour chaque sommet du graphique, puis Union les ensembles contenant chacune des paires de sommets pour chaque bord du graphique.

Enfin, vous savez qu'un chemin existe entre deux sommets s'ils sont dans le même ensemble.

Voir le Wikipédia Page sur la structure de données de définition disjointe.

C'est beaucoup plus efficace que d'utiliser un algorithme de recherche de chemin.

Utilisation

shortest_path(G, source, target)

ou l'une des méthodes de chemin les plus courtes. Restez à l'écart des méthodes qui retournent les chemins entre tous les nœuds, mais si vous avez simplement deux nœuds spécifiques à tester pour la connectivité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top