图论——割点
图的割点分两种情况,若不是根节点,则必须满足该点的子节点能回溯到自己或自己以上。若是根节点,只需满足有两个或以上子节点。
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; //根节点单独处理
}

浙公网安备 33010602011771号