优质博客地址
inline void dfs(int u){
dfn[ u ] = low[ u ] = ++t;
tack[++top] = u;intack[u] = true;
for (int i = head[u]; i ; i = a[i].d ){
if ( !dfn[ a[i].y ] ){
dfs( a[i].y );
low[ u ] = min( low[ a[i].y ],low[ u ]);
}
else if ( intack[ a[i].y] ){
low[ u ] = min( low[ a[i].y ],low[ u ]);
}
}
if ( dfn[ u ]==low[ u ]){
cnt++;int j = 0;
while ( 1 ){
j = tack[ top-- ];intack[ j ]=false;belong[ j ] = cnt;
if ( j == u ) break;
}
}
}
void tarjan(){
for (int j = 1; j <= n; j++)
if ( !dfn[j] ) dfs(j);
}