gpt4 book ai didi

algorithm - 图表中的接合点

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:49 26 4
gpt4 key购买 nike

给定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 树中不会是 'u' 的 child 。

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

最佳答案

首先让我们关注一下发音点的含义,这意味着当您删除图表时图表会 split 。

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

显然B是关节点。当我们从 A 点进行深度优先搜索时,我们得到 disc[A] < disc[B] < disc[C]。

low[B] <= disc[C],因为点c没有路径(不包括从其父节点的路径)到达上一个访问点,因此 B 点是一个发音。

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

关于algorithm - 图表中的接合点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16877739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com