networkx line digraph构造的正确性

时间:2013-08-13 16:24:05

标签: networkx

以下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)";

是否在线图构造中?

http://en.wikipedia.org/wiki/Line_graph#Line_digraph

2 个答案:

答案 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))