如何检查两个节点是否相连?

21

我有一个NetworkX图,其中有四个节点(a,b,c,d),它们之间部分连接。如何检查两个节点是否相邻?例如:如何断言ad不相邻?

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)

我尝试了以下方法,但失败了:

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

2
你是否正在尝试确定两个节点是否相邻,或者两个节点是否在同一个连通分量中? - mdml
你的回答解决了我的问题,但我需要阅读这些文章来确定我遇到的是哪个问题;-) 实际上,我的示例显示了人与人之间的关系。它检查a是否认识b。如果存在边缘,则它们互相认识,否则不认识。 - mcbetz
如果我的术语或问题不到位,随意更正... - mcbetz
我更新了问题,请查看。很高兴我的答案有用! - mdml
我学会了节点边缘之间的区别,并且解决了我的问题。非常感谢! - mcbetz
3个回答

20

使用NetworkX检查两个节点是否相连的一种方法是检查节点u是否是另一个节点v的邻居。

>>> def nodes_connected(u, v):
...     return u in G.neighbors(v)
... 
>>> nodes_connected("a", "d")
False
>>> nodes_connected("a", "c")
True
请注意,networkx.is_connected 函数用于检查图 G 中的每个节点是否可以从其他节点到达。这等价于说,G 中存在一个连通分量(即 len(nx.connected_components(G)) == 1)。

1
谢谢,那个可行。只是需要额外解释一下,因为我也得想一想:G.neighbors('a')会返回列表['c', 'b', 'd'],而u in ...则检查u是否是该列表的元素... - mcbetz
不确定为什么这个简单而基本的任务不在API中? - Louis Yang

12

这是推荐的方式:

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('d' not in G['a']) # True

2
不要使用“not x in y”,而应该使用更习惯用语的“x not in y”。 - lericson

7
我想您在询问“如何知道两个节点之间是否可以互相到达” 这可以通过以下代码解决。
networkx.algorithms.descendants(G, target_nodes)

它返回在G中从target_nodes可达的所有节点。


1
我知道这并没有回答提问者的问题,但是它帮助到了我! - TaxpayersMoney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接