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