2014-07-23 4 views
7

J'ai un graphe NetworkX avec quatre noeuds (a,b,c,d) qui sont partiellement connectés. Comment puis-je vérifier si deux nœuds sont adjacents? Par exemple: Comment pourrais-je affirmer que a et d ne sont pas adjacents?Comment vérifier si deux nœuds sont connectés?

import networkx as nx 
G=nx.Graph() 
G.add_edge('a','b',weight=1) 
G.add_edge('a','c',weight=1) 
G.add_edge('c','d',weight=1) 

J'ai essayé ce qui suit, mais a échoué:

nx.is_connected(G) # I assume it checks whether edges are connected at all 
nx.connected_components(G) # outputs an object that I can make no use of 
+0

Êtes-vous essayez de déterminer si deux noeuds sont adjacents [] (http://en.wikipedia.org/wiki/Neighbourhood_ (graph_theory)), ou deux noeuds sont dans le même [composant connecté] (http://en.wikipedia.org/wiki/Connected_component_ (graph_theory))? – mdml

+0

Votre réponse a résolu le problème que j'avais, mais j'ai besoin de lire ces articles pour voir quel problème j'avais ;-) En fait, mon exemple montre la relation entre les gens. Il vérifie si 'a' connaît' b'. Si un bord existe, ils se connaissent, sinon pas. – mcbetz

+0

N'hésitez pas à corriger la terminologie ou ma question, si ce n'est pas au point ... – mcbetz

Répondre

10

Une façon de vérifier si deux noeuds sont connectés avec NetworkX est de vérifier si un nœud u est un voisin d'un autre noeud v.

>>> def nodes_connected(u, v): 
...  return u in G.neighbors(v) 
... 
>>> nodes_connected("a", "d") 
False 
>>> nodes_connected("a", "c") 
True 

Notez que networkx.is_connected vérifie si tous les noeuds dans un graphe G est accessible à partir de chaque autre noeud dans G. Ceci est équivalent à dire qu'il y a une composante connexe dans G (c.-à-len(nx.connected_components(G)) == 1).

+0

Merci, ça marche. Juste une explication supplémentaire, parce que je devais y réfléchir à deux fois: 'G. Neighbours ('a')' retournerait la liste '['c', 'b', 'd']', et 'u in .. .' vérifie si 'u' est un élément de cette liste ... – mcbetz

5

Ceci est la méthode recommandée:

import networkx as nx 
G=nx.Graph() 
G.add_edge('a','b',weight=1) 
G.add_edge('a','c',weight=1) 
G.add_edge('c','d',weight=1) 

print(G.has_edge('a','d')) # False 
print('d' in G['a']) # False, faster 
print(not 'd' in G['a']) # True 
+0

N'utilisez jamais' not x in y', mais plutôt le plus idiomatique 'x not in y'. – lericson

Questions connexes