朱莉娅中的weakly_connected_components LightGraphs不应该提供连通的组件,如果DiGraph变成无向图,那么每个组件就应该连接起来吗?我已经试过了,但我没有收到这样的组件?举个例子,我在政治博客上尝试过,数据是一个无定向的网络。
data=readdlm(path,',',Int64) #contains edges in each row
N_ = length(unique(vcat(data[:,1],data[:,2]))) ##to get number of vertices
network = LightGraphs.DiGraph(N_)
#construct the network
for i in 1:size(data,1)
add_edge!(network, Edge(data[i,1], data[i,2]))
end
#largest weakly connected component
net = weakly_connected_components(network)[1]
temp_net,vmap = induced_subgraph(network, net)在得到最大的弱连接组件之后,我看到以下内容:
isempty([i for i in vertices(temp_net) if isempty(edges(temp_net).adj[i])])
julia>false这意味着有些节点没有传入或传出的边缘。有什么问题吗?我使用的是最新的第6版,但是LightGraphs包测试似乎是有效的。
发布于 2017-06-01 14:37:02
TL;DR的答案是,edges(temp_net).adj[i]只包含i连接到的顶点,而不包含连接到i的顶点。有些顶点没有传入的边。
更长的版本,如下所示,在随机生成的网络中,temp_net和问题中指定的确实是弱连接的。首先建立一个随机网络,其中包括:
julia> using LightGraphs
julia> N_ = 1000 ;
julia> network = LightGraphs.DiGraph(N_)
{1000, 0} directed simple Int64 graph
julia> using Distributions
julia> for i in 1:N_
add_edge!(network, sample(1:N_,2)...)
end
julia> net = weakly_connected_components(network)[1]
julia> temp_net,vmap = induced_subgraph(network, net)
({814, 978} directed simple Int64 graph, [1, 3, 4, 5, 6, 9, 10, 11, 12, 13 … 989, 990, 991, 993, 995, 996, 997, 998, 999, 1000])现在,我们有:
julia> length(vertices(temp_net))
814
julia> invertices = union((edges(temp_net).adj[i] for i in vertices(temp_net))...);
julia> outvertices = [i for i in vertices(temp_net) if !isempty(edges(temp_net).adj[i])] ;
julia> length(union(invertices,outvertices))
814因此,所有814个顶点都有从它们到它们(或两者)的边,并且都是弱连通分量的一部分。
发布于 2017-06-07 23:56:18
除了@dan所说的,我必须恳求您不要访问结构的任何内部数据字段--我们对所有“公共”的内容都有访问器。具体来说,不能保证edges(temp_net).adj是可用的。它目前与fadj(g)相同,这是g的前向邻接列表,用于有向图和无向图,但除了帮助保持边迭代状态之外,它不打算用于。
如果您使用.adj,您的代码会在没有警告的情况下在某个时候中断。
https://stackoverflow.com/questions/44301710
复制相似问题