Graph 无向图中关键节点的数目

Graph 无向图中关键节点的数目,graph,depth-first-search,Graph,Depth First Search,我有一个包含N个节点和E条边的图G。每条边都是无向的。目标是找到关键节点的数量 当移除图时,使其断开连接的节点称为关键节点。 目标是在图中找到此类节点的数量 解决办法是:- 对于属于图形的每个节点, 将其从图表中删除, 从剩余的图形中选择一个节点, 执行dfs, 如果我们能够到达任何地方,那么它就不是一个关键节点 这个解是O(N*E)或最坏情况O(N^3) 是否存在O(N^2)解或O(E)解,因为N^3有点太慢。关键节点是一个节点,当删除该节点时,会将图切割为两个或多个不相交的子图 因此,关键节

我有一个包含N个节点和E条边的图G。每条边都是无向的。目标是找到关键节点的数量

当移除图时,使其断开连接的节点称为关键节点。 目标是在图中找到此类节点的数量

解决办法是:-

对于属于图形的每个节点, 将其从图表中删除, 从剩余的图形中选择一个节点, 执行dfs, 如果我们能够到达任何地方,那么它就不是一个关键节点

这个解是O(N*E)或最坏情况O(N^3)


是否存在O(N^2)解或O(E)解,因为N^3有点太慢。

关键节点是一个节点,当删除该节点时,会将图切割为两个或多个不相交的子图

因此,关键节点是连接到仅通过该关键节点连接的2个或多个子图的节点

可能的解决方案如下:

  • 对于图G中的每个节点i:

  • 列表L:直接连接到节点i的所有节点

  • 如果列表L中存在2个节点u和v,这样就没有通过v连接u的路径,而不是通过i,那么i是一个关键节点

参考:

示例(Java语言):

公共类十字节点
{
公共静态数组列表交叉(图g)
{
ArrayList=newArrayList();
for(Node n:g.getV())if(isCrucial(g,n))critical.add(n);
回归至关重要;
}
公共静态布尔isCrucial(图g,节点n)
{
图h=新图(g);
h、 移除顶点(n);
对于(节点u:n.getNext())
{
对于(节点v:n.getNext())
{
如果(u等于(v))继续;
如果(!h.connected(u,v))返回true;
}
}
返回false;
}
}

关键节点不需要有关键边缘。把这个图作为一个例子,两个方块中的共同顶点是一个重要的顶点,但它没有决定性的边缘。“关键节点”实际上更正式地被称为关节点,不知道我是如何知道的,但是一个简单的谷歌搜索会发现非常好的算法来找出关节点。
public class CrucialNode
{
    public static ArrayList<Node> crucialVertices (Graph g)
    {
        ArrayList<Node> crucial = new ArrayList<Node> ();

        for (Node n : g.getV()) if (isCrucial(g,n)) crucial.add(n);

        return crucial;
    }

    public static boolean isCrucial (Graph g, Node n)
    {
        Graph h = new Graph(g);

        h.removeVertex(n);

        for (Node u : n.getNext())
        {
            for (Node v : n.getNext())
            {
                if (u.equals(v)) continue;

                if (!h.connected(u,v)) return true;
            }
        }

        return false;
    }
}