距离起始顶点的距离内的顶点数

时间:2016-03-06 23:25:53

标签: python algorithm graph-theory

我正在研究一个关于找到距离它一定距离内的顶点数量的法官的问题。必须对图上的所有顶点进行此操作。可以看到完整的问题规范 here.我有一些Python代码来解决程序,但它太慢了。

eval

我的代码所做的是它最初创建一组点,这些点是每个顶点的直接邻居(距离0到1)。之后,它为来自所有先前找到的邻居邻居(距离2)的每个顶点创建一组新邻居。然后它继续这样做,创建一组新的邻居并递增距离,直到达到最终距离。有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:0)

有很多好的和快速的解决方案。

其中一个(不是最快,但足够快)是使用BFS算法,距离 K 。只运行bfs,当距离超过 K 时,不会为所有顶点添加邻居。 K 是运动规范中的参数。

答案 1 :(得分:0)

我会使用adjacency matrix乘法。邻接矩阵是布尔方阵n * n,其中n是多个顶点。如果从adjacency_matrix[i][j]1的边缘存在,则i的值等于j,否则为0。如果我们将邻接矩阵自身相乘,我们得到长度为2的路径。如果我们再次这样做,我们得到长度为3的路径,依此类推。在你的情况下,K <= 5所以不会有太多的乘法。你可以使用numpy,它会非常快。所以在伪代码中,你的问题的解决方案看起来像这样:

adjacency_matrix = build_adjacency_matrix_from_input()
initial_adjacency_matrix = adjacency_matrix
result_matrix = adjacency_matrix
for i = 2 to K:
    adjacency_matrix = adjacency_matrix * initial_adjacency_matrix
    result_matrix = result_matrix + adjacency_matrix
for each row of result_matrix print how many values higher then 0 are in it    

答案 2 :(得分:0)

您想要长度为&lt; = K的路径。在这种情况下,BFS可用于轻松找到一定长度的路径。或者,如果您的图表使用邻接矩阵表示,则矩阵乘法也可用于这些目的。

如果使用BFS:  这相当于从给定的源顶点开始执行逐级遍历。这是伪代码,可以计算距给定源顶点距离为K的所有顶点:

Start: Let s be your source vertex and K represent max path length required

Create two Queues Q1 and Q2 and insert source vertex s into Q1
Let queueTobeEmptied = Q1 // represents the queue that is to be emptied
Let queueTobeFilled = Q2  // represents the queue that is used for inserting new elements discovered
Let Result be a vector of vertices: initialize it to be empty
Note: source vertex s is at level 0, push it to Result vector if that is also required

for(current_level=1; current_level<=K; current_level++) {
    while(queueTobeEmptied is not empty) {
        remove the vertex from queueTobeEmptied and call it as u
        for_each adjacent vertex 'v' of u {
            if v is not already visited {
                mark v as visited
                insert v into the queueTobeFilled     
                push v to Result                       
            }
        }
    }
    swap the queues now for next iteration of for loop: swap(queueTobeEmptied, queueTobeFilled)
}

Empty Q1 and Q2

End: Result is the vector that contains all the vertices of length <= K