void tarjan(int x) { int tmp=0;t=0;stack[++tmp]=x; dfn[x]=low[x]=++dfs_clock;vis[x]=1;st[++t]=x;cur[x]=point[x]; while (tmp) { int x=stack[tmp]; if (!cur[x]) { --tmp; if (dfn[x]==low[x]) { int now=0;++scc; while (now!=x) { now=st[t--]; belong[now]=scc; ++cnt[scc]; vis[now]=0; } } if (father[x]) low[father[x]]=min(low[father[x]],low[x]); continue; } int vt=v[cur[x]]; if (!dfn[vt]) { stack[++tmp]=vt;st[++t]=vt; dfn[vt]=low[vt]=++dfs_clock; father[vt]=x;vis[vt]=1; cur[vt]=point[vt]; } else if (vis[vt]) low[x]=min(low[x],dfn[vt]); cur[x]=nxt[cur[x]]; } }
void tarjan(int x) { dfn[x]=low[x]=++dfs_clock;vis[x]=1;st[++t]=x; for (int i=point[x];i;i=nxt[i]) if (!dfn[v[i]]) { tarjan(v[i]); low[x]=min(low[x],low[v[i]]); } else if (vis[v[i]]) low[x]=min(low[x],dfn[v[i]]); if (dfn[x]==low[x]) { int now=0;++scc; while (now!=x) { now=st[t--]; belong[now]=scc; ++cnt[scc]; vis[now]=0; } } }
void dfs_1() { int tmp=0;stack[++tmp]=1; size[1]=1;h[1]=1; for (int i=1;i<=n;++i) cur[i]=point[i]; while (tmp) { int x=stack[tmp]; while (cur[x]&&v[cur[x]]==father[x]) cur[x]=nxt[cur[x]]; if (!cur[x]) { --tmp; if (father[x]) { size[father[x]]+=size[x]; if (size[x]>size[son[father[x]]]) son[father[x]]=x; } continue; } int vt=v[cur[x]];stack[++tmp]=vt; father[vt]=x;size[vt]=1;h[vt]=h[x]+1; cur[x]=nxt[cur[x]]; } } void dfs_2() { int tmp=0;stack[++tmp]=1; top[1]=1;in[1]=++dfs_clock;num[dfs_clock]=a[1]; for (int i=1;i<=n;++i) cur[i]=point[i]; while (tmp) { int x=stack[tmp]; if (!use[x]) { use[x]=1; if (son[x]) { int vt=son[x]; top[vt]=top[x];in[vt]=++dfs_clock;num[dfs_clock]=a[vt]; stack[++tmp]=vt; } continue; } while (cur[x]&&(v[cur[x]]==father[x]||v[cur[x]]==son[x])) cur[x]=nxt[cur[x]]; if (!cur[x]) { --tmp; out[x]=dfs_clock; continue; } int vt=v[cur[x]];stack[++tmp]=vt; top[vt]=vt;in[vt]=++dfs_clock;num[dfs_clock]=a[vt]; cur[x]=nxt[cur[x]]; } }
void dfs_1(int x,int fa) { father[x]=fa;size[x]=1;h[x]=h[fa]+1; for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) { dfs_1(v[i],x); size[x]+=size[v[i]]; if (size[v[i]]>size[son[x]]) son[x]=v[i]; } } void dfs_2(int x,int fa) { if (son[fa]==x) top[x]=top[fa]; else top[x]=x; in[x]=++dfs_clock;num[dfs_clock]=a[x]; if (son[x]) dfs_2(son[x],x); for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa&&v[i]!=son[x]) dfs_2(v[i],x); out[x]=dfs_clock; }