有向图强连通分量 模板

来源:互联网 发布:守望先锋配置检测软件 编辑:程序博客网 时间:2024/06/16 20:53

强连通分量是指两两互相可达的一个分量。利用dfn而不是low的原因是还在栈中的元素low并没有计算完,而且没有计算low的必要,在割点后的已经被计算,在割点前的low值也不由这个节点来决定。

const int maxn = 10010;stack<int> stk;vector<int> G[maxn];int dfn[maxn], low[maxn], vis[maxn];int times, tot;//强连通分量的个数void tarjan(int u){    dfn[u] = low[u] = ++times;    stk.push(u);  vis[u] = -1;    for(int i = 0; i < G[u].size(); ++i){        int v = G[u][i];        if(vis[v] == 0){            tarjan(v);            low[u] = min(low[u], low[v]);        }        else{            if(vis[v] == -1)                low[u] = min(low[u], dfn[v]);        }    }    if(dfn[u] == low[u]){//u是一个强连通分量的根        tot++;        while(!stk.empty()){            int v = stk.top();  stk.pop();            vis[v] = 1;            if(v == u)                break;        }    }}void solve(int n){    for(int i = 1; i <= n; ++i){        if(vis[i] == 0)            tarjan(i);    }}
1 0
原创粉丝点击