给定简单图的邻接矩阵,如何编写枚举孤立顶点的函数? (如果有的话)
孤立的顶点是度数为0的顶点。
邻接矩阵看起来像这样
a, b, c, d, e = range(6)
# a b c d e f
N = [[0,1,0,0,0,1], # a
[1,0,1,0,0,0], # b
[0,1,0,1,0,0], # c
[0,0,1,0,0,1], # d
[0,0,0,0,0,0], # e
[1,0,0,1,0,0], # f
答案 0 :(得分:1)
要查找孤立的顶点,您可以形成图形的degree matrix,然后沿对角线查找0。以下是两个图表示例:
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# star adjacency matrix
star_adj = np.array([[0, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]])
# gr = nx.from_numpy_matrix(star_adj)
# nx.draw(gr)
# plt.show()
我们不希望这个星形图中有任何孤立的顶点。
iso_adj = np.array([[0, 1, 1, 0, 0], [1, 0, 1, 0, 0], [1, 1, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]])
该图的顶点4是孤立的。
现在我找到了degree_list(这个列表相当于度矩阵的主对角线,但是通过对邻接矩阵的列求和来制作整个矩阵没有意义,因为我们想要的只是对角线条目) (或行)。之后,我在此列表中打印==0
的索引。
def degree_list(adjacency_matrix):
return np.sum(adjacency_matrix, axis=1)
star_deg = degree_list(star_adj)
iso_deg = degree_list(iso_adj)
print star_deg # prints: [5 1 1 1 1 1]
print iso_deg # prints: [2 2 3 1 0]
print [i for i, v in enumerate(star_deg) if v==0] # prints: []
print [i for i, v in enumerate(iso_deg) if v==0] # prints: [4]
最后,对于你的帖子的邻接矩阵,这里是孤立的顶点:
c_adj = [[0,1,0,0,0,1], [1,0,1,0,0,0], [0,1,0,1,0,0], [0,0,1,0,0,1], [0,0,0,0,0,0], [1,0,0,1,0,0]]
print [i for i, v in enumerate(degree_list(c_adj)) if v==0] # prints [4]
i, v in enumerate(blah)
行从i
,enumerate()获取索引v
和值blah
。答案 1 :(得分:1)
# a b c d e f
N = [[0,1,0,0,0,1], # a
[1,0,1,0,0,0], # b
[0,1,0,1,0,0], # c
[0,0,1,0,0,1], # d
[0,0,0,0,0,0], # e
[1,0,0,1,0,0], # f
]
d=[ sum(i) for i in N]
print [i for i,v in enumerate(d) if v==0]
因此你得到[4]输出,这就是答案。
答案 2 :(得分:0)
您的问题缺少的是您尝试过的内容。回过头来发布你所尝试的内容,以便我们可以为你提供更多帮助,正如FrankV所说。但是,我会建议开始搞清楚这一点:
首先,你需要迭代一个2D数组(我假设这是你的编辑),所以你知道你需要一个嵌套的for循环。接下来,您需要检查四个不同的方向(当然是错误检查越界索引)以查看顶点是否有边缘;你会为你迭代的每个顶点做这个(O(n ^ 2)复杂度)。
这是算法的基本方法;当然,还有很多其他方法可以解决这个问题。但是,第一步是让它能够理解它,然后对其进行编码。当它正常工作时,请回到它并优化它。