int dfn[N], low[N], dfncnt, s[N], tp;
int scc[N], sc; // 结点 i 所在 scc 的编号
int sz[N]; // 强连通 i 的大小
void tarjan(int u) {
low[u] = dfn[u] = ++dfncnt, s[++tp] = u;
for(int i = h[u]; i; i = e[i].nex) {
const int &v = e[i].t;
if(!dfn[v])
tarjan(v), low[u] = min(low[u], low[v]);
else if(!scc[v])
low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u]) {
++sc;
while(s[tp] != u)
scc[s[tp]] = sc, sz[sc]++, --tp;
scc[s[tp]] = sc, sz[sc]++, --tp;
}
}
来源:https://www.cnblogs.com/Yinku/p/11361532.html