图中的清晰点

时间:2013-06-01 22:05:11

标签: algorithm graph

我正在通过解释的算法来查找图表中的所有关节点,给出Here

这是计算艺术点的功能:

// A recursive function that find articulation points using DFS traversal
// u --> The vertex to be visited next
// visited[] --> keeps tract of visited vertices
// disc[] --> Stores discovery times of visited vertices
// parent[] --> Stores parent vertices in DFS tree
// ap[] --> Store articulation points
void Graph::APUtil(int u, bool visited[], int disc[],
                                      int low[], int parent[], bool ap[])
{
    // A static variable is used for simplicity, we can avoid use of static
    // variable by passing a pointer.
    static int time = 0;

    // Count of children in DFS Tree
    int children = 0;

    // Mark the current node as visited
    visited[u] = true;

    // Initialize discovery time and low value
    disc[u] = low[u] = ++time;

    // Go through all vertices aadjacent to this
    list<int>::iterator i;
    for (i = adj[u].begin(); i != adj[u].end(); ++i)
    {
        int v = *i;  // v is current adjacent of u

        // If v is not visited yet, then make it a child of u
        // in DFS tree and recur for it
        if (!visited[v])
        {
            children++;
            parent[v] = u;
            APUtil(v, visited, disc, low, parent, ap);

            // Check if the subtree rooted with v has a connection to
            // one of the ancestors of u
            low[u]  = min(low[u], low[v]);

            // u is an articulation point in following cases

            // (1) u is root of DFS tree and has two or more chilren.
            if (parent[u] == NIL && children > 1)
               ap[u] = true;

            // (2) If u is not root and low value of one of its child is more
            // than discovery value of u.
            if (parent[u] != NIL && low[v] >= disc[u])
               ap[u] = true;
        }

        // Update low value of u for parent function calls.
        else if (v != parent[u])
            low[u]  = min(low[u], disc[v]);
    }
}

现在我有点难以理解这段代码的某些部分。

if (parent[u] != NIL && low[v] >= disc[u])
               ap[u] = true;

上面的陈述是否意味着,因为顶点'v'是顶点'u'的直接子节点,如果有一些顶点,可以从'v'或'v'本身到达,这是在'u'之后发现的,这意味着存在后缘。

现在是另一个声明,

else if (v != parent[u])
     low[u]  = min(low[u], disc[v]);

这句话让我很困惑。 混淆是,为什么在这里,“disc [v]”而不是“low [v]”,就像其他声明一样。 我推断的是因为'v'在这里已经被发现了,我们不能在这里使用“low [v]”,因为这基本上意味着我们在'u'中搜索后边缘时也会考虑'v'的后继者,这是错误的,因为'v'在这里不是'你在DFS树中的孩子。

我的解释是否正确?如果我错了,请给我正确的解释。

1 个答案:

答案 0 :(得分:3)

首先让我们关注发音点的含义, 这意味着删除图表时会拆分图表。

一个连接在一起的3个点的简单图表: A-B-C

很明显B是清晰点。 当我们从A点进行深度搜索时, 我们得到圆盘[A]&lt;盘[B]&lt;圆盘[C]。

低[B]&lt; = disc [C],因为没有路径(不包括来自其父级的路径),因为c点到达上一个访问点, 因此B点是清晰度。

从父[u]!= NIL,我们可以看到第一个是异常,因为之前没有前一点。