缩点

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);
        }
    }
}
posted @ 2022-08-11 11:13  hubingshan  阅读(11)  评论(0)    收藏  举报  来源