割点

int low[maxn],dfn[maxn],stac[maxn],vis[maxn],sd[maxn];
int cut[maxn],bridge[maxn],id,top;
void tarjan(int u,int fa)
{
low[u]=dfn[u]=++id;
int child=0;
for(int i=head[u];i;i=d[i].nxt )
{
int v=d[i].to;
if( !dfn[v] )
{
tarjan(v,fa),low[u]=min( low[u],low[v] );
if( low[v]>=dfn[u]&&u!=fa ) cut[u]=1;//u是割点
if( u==fa ) child++;
}
low[u]=min( low[u],dfn[v] );
}
if( child>=2&&u==fa ) cut[u]=1;
}

割边

int low[maxn],dfn[maxn],stac[maxn],vis[maxn],sd[maxn];
int cut[maxn],bridge[maxn],id,top;
void tarjan(int u,int fa)
{
low[u]=dfn[u]=++id;
for(int i=head[u];i;i=d[i].nxt )
{
int v=d[i].to;
if( !dfn[v] )
{
tarjan(v,u),low[u]=min( low[u],low[v] );
if( low[v]>dfn[u]) bridge[i]=1;
}
else if( v!=fa )
low[u]=min( low[u],dfn[v] );
}
}