正确的应该是:
void tarjan(int x){
dfn[x]=low[x]=++tot;
vis[x]=vis2[x]=1;
st.push(x);
for(auto it:mp[x]){
if(!dfn[it]){
tarjan(it);low[x]=min(low[x],low[it]);
}else if(vis[it]) low[x]=min(low[x],dfn[it]);
}if(dfn[x]==low[x]){
cnt++;
while(st.top()!=x){
num[cnt]++;col[st.top()]=cnt;vis[st.top()]=0;st.pop();
}num[cnt]++;col[x]=cnt;vis[x]=0;st.pop();
}
}
注意
不要把:
else if(vis[it]) low[x]=min(low[x],dfn[it]);
写成
else if(vis[x]) low[x]=min(low[x],dfn[it]);