1 inline void tarjan(int x) { 2 int v; 3 dfn[x] = low[x] = ++sum; 4 a.push(x); 5 _in[x] = 1; 6 for(int i = head[x];i != -1; i = e[i].next) { 7 v = e[i].to; 8 if(!dfn[v]) { 9 tarjan(v); 10 low[x] = min(low[x],low[v]); 11 } 12 else if(_in[v]) 13 low[x] = min(low[x],dfn[v]); 14 } 15 if(dfn[x] == low[x]) { 16 csp++; 17 do { 18 v = a.top(); 19 a.pop(); 20 _in[v] = false; 21 num[csp]++; 22 belong[v] = csp; 23 } 24 while(v != x); 25 } 26 }