【发布时间】:2021-04-03 16:40:17
【问题描述】:
所以基本上我实现了一个代码来查找图表中的关节点,我正在使用邻接列表来实现图表。一切正常,除了起点。它的孩子将拥有它的low 与根的num 相同,所以我需要添加一个额外的条件:if(low[w]>=num[v] && num[v] != 1)。 num[v] != 1 检查未将其与根进行比较。我试图绕过它,因为当我将根设置为 AP 时,它不起作用,或者它把整个事情搞砸了。本来图只有两个AP,我把root做为第三个来测试它是否有效,但它没有,帮帮我。
所以这行得通:
if(num[v]==1 && root_check == 2)
{
printf("%d is an Articulation Point!!!\n", v);
}
if(low[w]>=num[v] && num[v] != 1)
{
printf("%d is an Articulation Point!!!\n", v);
}
但这不是:
if(low[w]>=num[v] || (num[v]==1 && root_check==2))
{
printf("%d is an Articulation Point!!!\n", v);
}
代码:
void check_ap(struct Graph *G, int v)
{
int root_check = 0;
visited[v] = 1;
low[v] = num[v] = counter++;
struct VertexNode *adj = G->AdjListArr[v].head;
while(adj)
{
if(num[v]==1){++root_check;}
int w = adj->dest;
if(!visited[w])
{
parent[w] = v;
check_ap(G, w);
if(num[v]==1 && root_check == 2)
{
printf("%d is an Articulation Point!!!\n", v);
}
if(low[w]>=num[v] && num[v] != 1)
{
printf("%d is an Articulation Point!!!\n", v);
}
low[v] = min(low[v], low[w]);
}
else
{
if(parent[v]!=w)
{
low[v] = min(low[v], low[w]);
}
}
adj=adj->next;
}
}
还有,为什么3 is an Articulation Point!!!会出现两次??
输出:
3 is an Articulation Point!!!
3 is an Articulation Point!!!
0 is an Articulation Point!!!
1 is an Articulation Point!!!
【问题讨论】:
-
缺少 'num[v] != 1'?
-
@tstanisl 是的
if((low[w]>=num[v] && num[v]!=1) || (num[v]==1 && root_check==2))修复了它。谢谢!
标签: c algorithm data-structures graph adjacency-list