Tarjan算法(待填坑)

算法问题描述

不知道不知道,你想知道吗,出门左转百度谢谢

算法思想

天知道什么思想

代码

void Tarjan(int u){   //边双
    dfn[u]=low[u]=time++;
    s.push(u); vis[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(!dfn[v]){
            Tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u]){
        tot++;
        while(!s.empty() && s.top()!=u){
            int x=s.top(); s.pop(); vis[x]=0; mem[x]=tot;
        }
        int x=s.top(); s.pop(); vis[x]=0; mem[x]=tot;
    }
}
void Tarjan(int u){   //点双+圆方树
    dfn[u]=low[u]=++tim;
    S.push(u);
    for(int i=head[u];i!=-1;i=e[i].nxt){
        int v=e[i].v;
        if(!dfn[v]){
            Tarjan(v);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<=low[v]){
                ++tot;
                while(S.top()!=v){_e[tot].pb(S.top()); _e[S.top()].pb(tot); S.pop(); }
                _e[tot].pb(v); _e[v].pb(tot); S.pop();
                _e[tot].pb(u); _e[u].pb(tot);
            }
        }
        else low[u]=min(low[u],dfn[v]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32461955/article/details/81843769
今日推荐