1.求割点
int clock,ans,root,cur[N];
void dfs(int u,int fa)
{
dfn[u]=low[u]=++clock;
int son=0;
for(int i=0;i<V[u].size();i++)
{
int to=V[u][i];
if(to==fa)continue;
if(!dfn[to])
{
dfs(to,u);
low[u]=min(low[u],low[to]);
if(low[to]>=dfn[u])son++;
}
else low[u]=min(low[u],dfn[to]);
}
if(u==root&&son>1) cur[u]=son;
else if(u!=root&&son) cur[u]=son+1;
else cur[u]=0;
}
clock 记录进入该深搜子树的时间戳,ans记录割点的数量,root记录根。
从任意一点进行一遍dfs就能得到所有的割点。
某一点为割点的条件
1.该点根节点且至少有两个子女(此时去点此点,两个子女即断开了)
2.该点不是根节点,但是至少有一个子女的low值大于当前的dfn值(说明至少有一个子女不能通过回边到达u的祖先)