如何查找连接的子图?

时间:2013-04-02 07:42:40

标签: algorithm graph

我有一个网络,但此网络未连接。我想知道如何在这个网络中找到最大的连接图?

3 个答案:

答案 0 :(得分:1)

要计算节点所属的连通组件,只需运行任何类型的图搜索算法,例如breadth-first search

要解决您的问题,请迭代网络中的所有节点并执行以下操作:

  1. 如果已将给定节点添加到组件,请转到下一个节点(继续迭代)
  2. 如果节点尚未添加到组件,则运行任何图搜索(例如,如上所述的BFS)并将所有访问的节点标记为属于同一组件。
  3. 选择上面步骤2中构建的最大尺寸组件。

答案 1 :(得分:0)

让图形为[n] [n],如果i,j连接,则[i] [j] = 1。

你可以这样做。

count=0;/global


void dfs(int i)
{

int k;
for(k=0;k<n;k++)
    if(A[i][k]==1 && !visited[k])
    {
        count++;
        visited[k]=1;
        dfs(k);
    }
}
for(i=0; i < n;i++)
    {
        if(!visited[i])
        {
            count=1;
            visited[i]=1;
            dfs(i);
                            // map i with count .. here

        }
    }

因此,一旦您使用其中一个节点映射了网络中节点的计数。

您现在需要做的就是在地图中找到具有最大数量的节点。

所以你将获得密钥,这是一个带有计数图(i)的大型网络节点。

将所有访问的节点设置为0并再次应用dfs(i),您可以使用

连接整个网络

我和你无论如何都有计数。

答案 2 :(得分:0)

另一种简单方法是使用union-find

S = array filled with 1s (|V| elements)

for each edge (u,v) in E:
    if find_set(u) != find_set(v):
        sum = S[find_set(u)] + S[find_set(v)]
        S[find_set(v)] = sum
        S[find_set(u)] = sum
        union_set(u, v)

最后,S [find_set(u)]将是节点u所属的连通组件的大小。要找到最大值,您只需要找到最大值(S)。

由于find_set和union_set都很容易实现(每行2行C ++),我发现这种方法比DFS或BFS更清晰。