Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求邻接矩阵图的连通分量_Algorithm_Graph_Matrix_Graph Theory - Fatal编程技术网

Algorithm 求邻接矩阵图的连通分量

Algorithm 求邻接矩阵图的连通分量,algorithm,graph,matrix,graph-theory,Algorithm,Graph,Matrix,Graph Theory,在Java中,我有一个由邻接矩阵表示的随机图,如何在这个图中找到连接的组件(子图) 我已经找到了BFS和DFS,但不确定它们是否合适,也不知道如何为邻接矩阵实现它们 有什么想法吗?您需要分配长度为n的marks-int数组,其中n是图中的顶点数,并用零填充。然后: 1) 对于BFS,请执行以下操作: Components = 0; Enumerate all vertices, if for vertex number i, marks[i] == 0 then ++Componen

在Java中,我有一个由邻接矩阵表示的随机图,如何在这个图中找到连接的组件(子图)

我已经找到了BFS和DFS,但不确定它们是否合适,也不知道如何为邻接矩阵实现它们


有什么想法吗?

您需要分配长度为n的marks-int数组,其中n是图中的顶点数,并用零填充。然后:

1) 对于BFS,请执行以下操作:

Components = 0;

Enumerate all vertices, if for vertex number i, marks[i] == 0 then

    ++Components;

    Put this vertex into queue, and 

    while queue is not empty, 

        pop vertex v from q

        marks[v] = Components;

        Put all adjacent vertices with marks equal to zero into queue.
2) 对于DFS,请执行以下操作

Components = 0;

Enumerate all vertices, if for vertex number i, marks[i] == 0 then

    ++Components;

    Call DFS(i, Components), where DFS is

    DFS(vertex, Components)
    {
        marks[vertex] = Components;
        Enumerate all vertices adjacent to vertex and 
        for all vertex j for which marks[j] == 0
            call DFS(j, Components);
    }
执行上述任何程序后,组件将具有多个连接组件, 对于每个顶点i,标记[i]将表示连接组件i所属的索引

两者都在O(n)时间完成,使用O(n)内存,其中n是矩阵大小。但我建议您使用BFS,因为它不会受到堆栈溢出问题的影响,并且不会花费时间在递归调用上

Java中的BFS代码:

publicstaticboolean[]BFS(boolean[][]邻接矩阵,int-vertexCount,int-givenVertex){
//结果数组。
布尔[]标记=新布尔[vertexCount];
Queue Queue=new LinkedList();
queue.add(givenVertex);
标记[givenVertex]=真;
而(!queue.isEmpty())
{
当前整数=queue.remove();
对于(int i=0;i
您可以使用堆栈迭代实现DFS,以消除递归调用和调用堆栈溢出的问题。该实现与使用队列的BFS非常相似-您只需在弹出顶点时标记它们,而不是在将它们推入堆栈时标记它们。

使用scipy的稀疏模块

假设您的输入是从
(标签1,标签2)
权重的字典
您可以运行以下代码:

vertices, edges = dict2graph(cooccur_matrix, edge_threshold)
n, components = sparse.csgraph.connected_components(edges, directed=False)
print ('Found {n} components'.format(n=n))
components = collect_components(components,vertices)
components = [c for c in components if len(c)>=component_threshold]
print ('removed {k} small components'.format(k=n-len(components)))
print ('component sizes: '+ repr([len(c) for c in components]))

参见github上的完整要点

邻接矩阵是如何存储的?一些数据格式可能会使用额外的技巧。谢谢,我意识到我原来的问题不太清楚。我需要找到给定顶点的连接组件(以便找到其他可到达的顶点)。我意识到这可能是相似的,但我无法想象它,你能给我一个类似的伪代码吗?你所需要的就是把枚举圈放在顶端,从Components=1:1开始。对于BFS,你需要把你给定的顶点放入队列,并遵循算法。2) 对于DFS,只需调用DFS(顶点,1)。在这之后,对于所有顶点,我属于与给定顶点相同的连接组件,你将有标记[i]==1,其他顶点的标记[i]==0。对不起,我不太明白你删除顶部枚举圈的意思,你介意再写一次吗?谢谢另外,对于这个问题,哪一个最好使用BFS还是DFS?@WITH'sWind,请注意,该算法的复杂性是
O(max(| V |,E |))
@WITH'sWind,如果“矩阵大小”是指节点数的平方,那么是的。