图论——割点

图的割点分两种情况,若不是根节点,则必须满足该点的子节点能回溯到自己或自己以上。若是根节点,只需满足有两个或以上子节点。

void dfs(int u,int fa)                 //随便选一点当根节点
{
  low[u]=num[u]=++dfn;                 //dfn表示时间戳,遍历一个节点就增加
  int child=0;
  for(int i=0;i<G[u].size();i++)
  {
    int v=G[u][i];
    if(!num[v])                    //若没用访问过,
    {
      child++;
      dfs(v,u);
      low[u]=min(low[u],low[v]);
      if(low[v]>=num[u]&&u!=1)
        iscut[u]=true;
    }
    else if(v!=fa&&num[v]<num[u])
    {
      low[u]=min(low[u],num[v]);
    }
  }
  if(u==1&&child>1) iscut[1]=1;   //根节点单独处理
}
posted @ 2025-03-07 00:02  _窗帘  阅读(15)  评论(0)    收藏  举报