for(int i=0;i<n;i++) //图可能是不连通的,因此要表里每个点
if(!dfn[i])
tarjan(i);
void tarjan(int u)
{
int i,v;
dfn[u]=low[u]=ntime++;
z.push(u);
f[u]=1;
for(i=0;i<q[u].size();i++){
v=q[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(f[v]==1)
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
while(1){
v=z.top();
z.pop();
f[v]=0;
ceng[v]=nceng;//分层,ceng[v]表示v点存在第cneng层
if(v==u){
nceng++;
break;
}
}
}