无向图中的关键节点数

时间:2013-04-06 05:30:19

标签: graph depth-first-search

我有一个包含N个节点和E个边缘的图G.每个边都是不定向的。目标是找到no。关键节点。

在删除图表时断开图形的节点称为关键节点。 目标是找到不。图中的这些节点。

解决方案是: -

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

该解决方案是O(N * E)或最差情况O(N ^ 3)。

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

1 个答案:

答案 0 :(得分:2)

关键节点是一个节点,删除后会将图形切割成2个或更多不相交的子图..

因此,关键节点是连接到2个或更多子图的节点,这些子图只通过这个关键节点连接 ..

可能的解决方案可能是这样的:

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

    1. list L:直接连接到节点i的所有节点

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

参考:Wikipedia:Cycle Detection

示例(在Java中):

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;
    }
}