2017-06-01 142 views
0

是不是真的,在朱LightGraphs的weakly_connected_components應當提供其中如果向圖變成無向圖中,則每個部件應該連接的連接分量? 我曾經嘗試這樣做,我不接受這樣的組件?作爲一個例子,我曾經嘗試這樣做的政治博客數據爲無向網絡朱莉婭LightGraphs weakly_connected_components

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 

其中signigies一些節點沒有傳入或傳出邊緣。 有什麼問題?我正在使用最新版本6,但LightGraphs包測試似乎正在工作。

回答

1

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個頂點要麼從邊緣,或將它們(或兩者),並且是弱部分連接組件。

5

除了@丹·蓋茨說了什麼,我必須懇求你不訪問結構的任何內部數據字段 - 我們有一切的「公共」訪問器。具體而言,edges(temp_net).adj不保證可用。這是目前同fadj(g)g正向鄰接表,對於定向和非定向圖表,但它並不打算使用除了幫助保持邊緣迭代狀態。

如果使用.adj,你的代碼將在你沒有打破在一些點警告。