模板 - 强连通分量 - Tarjan

白昼怎懂夜的黑 提交于 2019-11-27 11:31:53
int dfn[N], low[N], dfncnt, s[N], tp;
int scc[N], sc;  // 结点 i 所在 scc 的编号
int sz[N];       // 强连通 i 的大小
void tarjan(int u) {
    low[u] = dfn[u] = ++dfncnt, s[++tp] = u;
    for(int i = h[u]; i; i = e[i].nex) {
        const int &v = e[i].t;
        if(!dfn[v])
            tarjan(v), low[u] = min(low[u], low[v]);
        else if(!scc[v])
            low[u] = min(low[u], dfn[v]);
    }
    if(dfn[u] == low[u]) {
        ++sc;
        while(s[tp] != u)
            scc[s[tp]] = sc, sz[sc]++, --tp;
        scc[s[tp]] = sc, sz[sc]++, --tp;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!