2010-03-01 106 views

Respuesta

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 
>>> 

También puede utilizar el resultado como un valor booleano

>>> 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

¿Qué pasa si no existe trayectoria entre 2 nodos dados? ¿Qué devuelve la función entonces? – Bruce

+1

No quiero encontrar el camino más corto. Solo quiero saber si existe una ruta entre 2 nodos dados. – Bruce

7

Uso

shortest_path(G, source, target) 

o uno de los métodos camino más corto. Sin embargo, manténgase alejado de los métodos que devuelven las rutas entre todos los nodos si solo tiene dos nodos específicos para probar la conectividad.

10

Uso de una estructura de datos conjunto disjuntos:

Crear un conjunto unitario para cada vértice en el gráfico, entonces Unión los conjuntos que contienen cada uno del par de vértices por cada borde en el gráfico.

Finalmente, sabes que existe una ruta entre dos vértices si están en el mismo conjunto.

Consulte la página wikipedia en la estructura de datos de conjunto disjuntos.

Esto es mucho más eficiente que usar un algoritmo de búsqueda de ruta.

+0

¿Funcionará esto para gráficos dirigidos? – ericmjl

+0

Bueno, acabo de implementarlo para mí recientemente, y funciona. :-) – ericmjl

17

Para comprobar si existe un camino entre dos nodos en un gráfico -

>>> 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 

Para obtener más información, consulte has_path — NetworkX 1.7 documentation

Cuestiones relacionadas