int tot,bel[MAXV+D];//tot代表强连通分量总数,bel数组代表点属于第几个连通分量
int dfn[MAXV+D],low[MAXV+D],ind=0;
int stack[MAXV+D],top;
bool ins[MAXV+D];
void tarjan(int x)
{
dfn[x]=low[x]=++ind;
ins[stack[++top]=x]=true;
for(int i=head[x],y;i;i=e[i].next)
if(!dfn[y=e[i].y])
{
tarjan(y);
if(low[y]<low[x])
low[x]=low[y];
}
else if(ins[y]&&dfn[y]<low[x])
low[x]=dfn[y];
}
if(dfn[x]==low[x])
{
int k;tot++;
do{
k=stack[top--];
ins[k]=false;
bel[k]=tot;
}while(k!=x);
}
}