给出边缘列表,例如
edges = [[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6], [10, 11], [12, 9], [12, 10]]
我需要找到列表中有多少重复连接。
在此示例中:连接按顺序
进行dup = 0
1-2
1-2-3
然后[2,3]
已经连接,因此我们将dup
增加1
1-2-3, 4-5
1-2-3, 4-5-6
然后[5,6]
已经连接,所以我们再次将dup
增加1
1-2-3, 4-5-6, 10-11
1-2-3, 4-5-6, 9-12, 10-11
1-2-3, 4-5-6, 9-10-11-12
返回dup = 2
最后一步是我的方法搞砸了,因为它将[12,10]
计为重复,因为我当前的方法是将数字添加到字典中并检查x和y是否都在字典中然后我将dup增加1
但我真正需要做的是检查x和y是否已经连接,如果是,那么将dup增加1
但我很难找到办法做到这一点。
答案 0 :(得分:1)
在我看来,你基本上有一个邻接列表,你需要的是一个邻接矩阵。以下是我将如何做到这一点:
制作一个二维数组(这是邻接矩阵)。对于您给出的示例,这将是12x12矩阵。使用所有False值初始化矩阵
对于每条边,输入相应位置的True值(即对于[1,2],您将在位置[1,2]和[2,1]中输入True)
现在,您还需要标记间接连接。对于[1,2]的新True条目,您可以在第2行中找到所有True值,并将第1行中的相应值设置为True(反之亦然)
注意:在更新表之前,您可以通过检查第1行和第2行都是True的位置来检查重复项
答案 1 :(得分:0)
在研究这个问题时,我遇到了一个名为networkx
的软件包。显然,这个问题非常简单。我喜欢90%的编程只依靠聪明人来完成所有的努力,因为我肯定做不到。
import networkx as nx
def find_duplicate_edges(edges):
graph = nx.Graph()
for n1, n2 in edges:
if graph.has_node(n1) and graph.has_node(n2) and nx.has_path(graph, n1, n2):
yield n1, n2
else:
graph.add_edge(n1, n2)
if __name__ == '__main__':
edges = [[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6], [10, 11], [12, 9], [12, 10]]
for edge in find_duplicate_edges(edges):
print(edge)
<强>输出强>
(2, 3)
(5, 6)