【问题标题】:C - Graph - How to add root check for finding Articulation PointsC - 图表 - 如何添加根检查以查找关节点
【发布时间】: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


【解决方案1】:

缺少第二个条件中存在的表达式&& num[v] != 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2011-04-16
    • 2016-09-01
    相关资源
    最近更新 更多