2010-03-01 6 views

Répondre

12
>>> 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 une 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" 
... 
>>> 
3
+0

si chemin n'existe pas entre 2 noeuds donnés? Qu'est-ce que la fonction retourne alors? – Bruce

+1

Je ne veux pas trouver le chemin le plus court. Je veux juste savoir si un chemin existe entre 2 nœuds donnés. – Bruce

7

Utilisez

shortest_path(G, source, target) 

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

10

En utilisant une structure de données de jeu disjoints:

Créer un singleton pour chaque sommet du graphe, puis les syndicats ensembles contenant chacun des deux sommets pour chaque bord dans le graphique. Enfin, vous savez qu'un chemin existe entre deux sommets s'ils sont dans le même ensemble.

Voir la page wikipedia sur la structure de données des ensembles disjoints.

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

+0

Cela fonctionnera-t-il pour les graphes orientés? – ericmjl

+0

Eh bien, je viens de l'implémenter récemment, et ça fonctionne. :-) – ericmjl

17

Pour vérifier s'il y a un chemin entre deux noeuds dans un graphe -

>>> 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, s'il vous plaît se référer has_path — NetworkX 1.7 documentation

Questions connexes