Tarjan板子

梦想的初衷 提交于 2019-12-03 09:58:15

缩点

inline void tarjan(int u){
    dfn[u]=low[u]=++tarclock;
    vis[u]=1;
    s.push(u);
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(vis[v])low[u]=min(low[u],low[v]);
    }
    if(low[u]==dfn[u]){
        sum++;
        while(1){
            int x=s.top();
            s.pop();
            vis[x]=0;
            color[x]=sum;
            num[color[x]]++;
            if(x==u)break;
        }
    }
}

割点

inline void tarjan(int u,int fa){
    low[u]=dfn[u]=++time;
    int child=0;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(!dfn[v]){
            tarjan(v,fa);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u]&&u!=fa)cut[u]=1;
            if(u==fa)child++;
        }
        low[u]=min(low[u],dfn[v]);
    }
    if(child>=2&&u==fa)cut[u]=1;
}

割边

LCA

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!