我有一个有向图G,它是在Python中使用networkX创建的。每个边都是双向的。我有一个特定的节点列表,我试图在这些节点中找到连接的组件。下面我创建了一个示例数据集(我正在处理的实际图形要大得多)。
import networkx as nx
G = nx.DiGraph()
nodeList = range(1,10)
for i in range (0,len(nodeList)):
G.add_node(nodeList[i])
o_nodes = [1,1,2,3,3,3,3,4,4,5,5,6,7,7,8,9,9,10]
d_nodes = [8,3,3,1,7,2,4,5,3,4,6,5,3,9,1,7,10,9]
for i in range(0, len(o_nodes)):
G.add_edge(o_nodes[i], d_nodes[i])
nx.draw(G, with_labels = True)
Picture of the resulting graph
比方说,我有一个节点列表selectNodeList = [1,2,5,6,7,8,9,10]
,我需要在这些节点中找到连接的组件。因此,作为结果,我想得到类似[8,1], [7,9,10], [2], [5,6]
的东西。我想从选择节点列表中获得覆盖所有节点所需的最少数量的组件。
我已经尝试过使用带有if nx.shortest_path_length(G, source = selectNodeList[i], target = selectNodeList[j]) == 1:
的for循环,然后附加到列表中以获得每个节点的直接邻居,但是我不确定此后如何到达邻居以及如何创建邻居。可读的输出。
编辑:这是我在上一部分中提到的代码。我不愿意添加它,因为它还没有完全完成。我的思维方式是,首先获取两个直接邻居的节点,然后搜索另一个也是这些节点之一的直接邻居的节点,依此类推。但是,这根本不会输出未连接的节点,并且会导致连接节点重复的列表(例如[1 8 1 8 1 8 5 6 5 6 ...]。对我来说,一个问题是我不知道我不知道如何处理创建尺寸不同的输出,以及如何在不创建大量for循环的情况下解决问题。
connected = []
for i in range(0,34):
for j in range (1,34):
if nx.shortest_path_length(G, source = selectNodeList[i], target = selectNodeList[j]) == 1:
connected.append(selectNodeList[i])
connected.append(selectNodeList[j])
for k in range(2,34):
if nx.shortest_path_length(G, source = selectNodeList[j], target = selectNodeList[k]) == 1:
connected.append(selectNodeList[k])
for l in range (3,34):
if nx.shortest_path_length(G, source = selectNodeList[k], target = selectNodeList[l]) == 1:
connected.append(selectNodeList[l])
for m in range(4,34):
if nx.shortest_path_length(G, source = selectNodeList[l], target = selectNodeList[m]) == 1:
connected.append(selectNodeList[m])
答案 0 :(得分:1)
您需要在由节点子集引起的子图中找到连接的组件(无论弱还是强,都没关系,因为所有边缘都是双向的)。
<template>
<div>
<post-list @showFullPost="showFullPost($event)" v-show="!showingFullPost"></post-list>
<full-post @goBack="showAllPosts" v-if="showingFullPost"></full-post>
</div>
</template>
<script>
export default{
data: function(){
return {
currentHeight: 0,
showingFullPost: false
}
},
methods:{
showFullPost(post){
this.currentHeight = window.scrollY;
//other code
},
showAllPosts(){
//some code
window.scrollTop(0, this.currentHeight); //this only works the first time and subsequently goes to the position of the first time
}
}
}
</script>
[[8,1],[2],[5,6],[9,10,7]]