缩点
tarjan
void tarjan(int x){
dfn[x]=low[x]=++tot,zhan[++t]=x,u[x]=1;
for(int i=h[x];i;i=d[i].n){
int y=d[i].b;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(u[y]){
low[x]=min(low[x],dfn[y]);
//等价于 low[x]=min(low[x],low[y]);
}
}
if(dfn[x]==low[x]){
while(zhan[t]!=x){
col[zhan[t]]=x,val[x]+=v[zhan[t]],u[zhan[t]]=0,t--;
}
col[zhan[t]]=x,val[x]+=v[zhan[t]],u[zhan[t]]=0,t--;
}
}
void TARJAN(){
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
}

浙公网安备 33010602011771号