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); } }