如何找到孤立的顶点?

时间:2015-05-20 15:16:21

标签: python adjacency-matrix

给定简单图的邻接矩阵,如何编写枚举孤立顶点的函数? (如果有的话)

孤立的顶点是度数为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

3 个答案:

答案 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()

enter image description here

我们不希望这个星形图中有任何孤立的顶点。

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]])

enter image description here

该图的顶点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)行从ienumerate()获取索引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)复杂度)。

这是算法的基本方法;当然,还有很多其他方法可以解决这个问题。但是,第一步是让它能够理解它,然后对其进行编码。当它正常工作时,请回到它并优化它。