Tarjan eDcc 缩点

概念

无向图中极大的不包含割边的连通块被称为“边双连通分量”。

typedef pair<int,int> PII;
int n,m;
vector<PII> edges[N];
stack<int> stk;
int dcc[N],dfn[N],low[N],tot,cnt;
int degree[N];
struct edge{
    int u,v;
};
vector<edge> e;
void tarjan(int u,int last){
    dfn[u]=low[u]=++tot;
    stk.push(u);
    for(auto &[v,id]:edges[u]){
        if(id==last)
            continue;
        if(!dfn[v]){
            tarjan(v,id);
            low[u]=min(low[u],low[v]);
            // if(low[v]>dfn[u]){
            //     ;
            // }
        }
        else{
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(low[u]==dfn[u]){
        ++cnt;
        int v;
        do{
            v=stk.top();
            stk.pop();
            dcc[v]=cnt;
        }while(v!=u);
    }
}
posted @ 2025-09-11 16:35  xdhking  阅读(6)  评论(0)    收藏  举报