缩点
inline void tarjan(int u){
dfn[u]=low[u]=++tarclock;
vis[u]=1;
s.push(u);
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],low[v]);
}
if(low[u]==dfn[u]){
sum++;
while(1){
int x=s.top();
s.pop();
vis[x]=0;
color[x]=sum;
num[color[x]]++;
if(x==u)break;
}
}
}
割点
inline void tarjan(int u,int fa){
low[u]=dfn[u]=++time;
int child=0;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(!dfn[v]){
tarjan(v,fa);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]&&u!=fa)cut[u]=1;
if(u==fa)child++;
}
low[u]=min(low[u],dfn[v]);
}
if(child>=2&&u==fa)cut[u]=1;
}
割边
LCA