以下Python代码:
import networkx as nx
g = nx.DiGraph()
g.add_nodes_from([0, 1])
g.add_edges_from([(0,0), (0,1), (1,0), (1,1)])
nx.write_dot(g, 'g.dot')
gl = nx.line_graph(g)
nx.write_dot(gl, 'gl.dot')
创建以下点格式图:
--- g.dot ---
digraph {
0 -> 0;
0 -> 1;
1 -> 0;
1 -> 1;
}
--- gl.dot ---
strict digraph {
"(0, 1)" -> "(1, 1)";
"(1, 0)" -> "(0, 0)";
"(0, 0)" -> "(0, 1)";
"(1, 1)" -> "(1, 0)";
}
边缘应该是:
"(1, 0)" -> "(0, 1)";
"(0, 1)" -> "(1, 0)";
"(0, 0)" -> "(1, 1)";
"(1, 1)" -> "(0, 0)";
是否在线图构造中?
答案 0 :(得分:1)
nx.line_graph
创造了严格的DiGraph。严格意味着没有循环,没有重复的边缘。 "(0, 1)" -> "(1, 0)"
是一个循环,因此不包括在内。换句话说,当v = w 时,“表示从u到v以及从w到x的g的有向边的两个顶点通过严格线图中的uv到wx的边连接”你!= x “。 (引自维基百科 - 我的插入是大胆的。)
答案 1 :(得分:0)
NetworkX行有向图代码不会为自循环添加隔离,也不允许在折线图中创建自循环(原始图形中的长度为2的循环)。
这可能是错误或功能。如果有人能指出我对这些案例的线图的定义,我们至少可以澄清文档或更新代码。
请注意,在这种情况下,点文件关键字“strict”基本上是正确的,但只是一个幸运的巧合,即写入点文件的代码检查自循环和多边缘,如果找不到任何边缘则使用“严格” 。
此时,这是一种生成有向两种循环的有向线图的方法:
import networkx as nx
def directed_line_graph(G):
L = nx.DiGraph()
for u, adj in G.adjacency_iter():
for v in adj:
L.add_node((u,v)) # add self loops and single edges as nodes
for w in G[v]: # neighbors of v
if not (u == v and v == w):
L.add_edge((u,v),(v,w))
return L
g = nx.DiGraph()
g.add_edges_from([(0,0), (0,1), (1,0), (1,1)])
gl = directed_line_graph(g)
for e in gl.edges():
print e
# ((0, 1), (1, 0))
# ((0, 1), (1, 1))
# ((1, 0), (0, 1))
# ((1, 0), (0, 0))
# ((0, 0), (0, 1))
# ((1, 1), (1, 0))