阅读背景:

无向图的tarjan算法

来源:互联网 

-无向图求点双联通分量 并求单环
将桥和割点分开讨论
注意判断根是否为割点

stack<int> W;
ll f[maxnn];
int scc=0;
ll sum[maxnn];
int ttt[maxnn];
int ma[maxnn],mi[maxnn];
void tarjan(int v,int fa) {
    int r;
    mark[v]=1;
    dfn[v]=low[v]=++vis;
    W.push(v);
    for(int i=las[v]; i; i=nex[i]) {
        int u=en[i];
        int d;
        if(u!=fa) {
            if(!dfn[u]) {
                tarjan(u,v);
                low[v]=min(low[v],low[u]);
                if(dfn[v]==low[u]) {
                    scc++;
                    mi[scc]=v;
                    rrr[scc]=1;
                    ma[scc]=v;
                    do {
                        d=W.top();
                        rrr[scc]++;
                        mi[scc]=min(mi[scc],d);
                        ma[scc]=max(ma[scc],d);
                        W.pop();
                    } while(d!=u);
                }
                if(dfn[v]<low[u]) {
                    do {
                        
                        d=W.top();
                        W.pop();
                    } while(d!=u);
                }
            } else {
                low[v]=min(low[v],dfn[u]);
            }
        }
    }
}stack<in



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: