我正在通过解释的算法来查找图表中的所有关节点,给出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树中的孩子。
我的解释是否正确?如果我错了,请给我正确的解释。
答案 0 :(得分:3)
首先让我们关注发音点的含义, 这意味着删除图表时会拆分图表。
一个连接在一起的3个点的简单图表: A-B-C
很明显B是清晰点。 当我们从A点进行深度搜索时, 我们得到圆盘[A]&lt;盘[B]&lt;圆盘[C]。
低[B]&lt; = disc [C],因为没有路径(不包括来自其父级的路径),因为c点到达上一个访问点, 因此B点是清晰度。
从父[u]!= NIL,我们可以看到第一个是异常,因为之前没有前一点。