强连通分量

来源:互联网 发布:淘宝网秋装睡衣 编辑:程序博客网 时间:2024/05/16 02:05


1.tarjan算法


算法介绍:tarjan算法


模板:

int cnt=0;                      //有几个强连通分量vector<int> G[10010];           //vector邻接表int dfn[10010],low[10010];      //dfn[u]:节点u搜索的次序编号(时间戳) low[u]:u或u的子树能够追溯到的最早的栈中节点的次序号int instack[10010];             //标记是否在栈中int index=0;                    //节点访问次序stack<int> q;void tarjan(int u){    //根据dfn的特性,他也可以用作标记是否一个点已被访问    dfn[u] = low[u] = ++index;    q.push(u);    for(int i = 0 ; i < G[i].size() ; i++)    {        int v = G[u][i];        if(!dfn[v])        {            tarjan(v);            low[u] = min(low[u],low[v]);        }        else if(instack[u])            low[u] = min(low[u],dfn[v]);    }    if(low[u] == dfn[u])    {        do        {            int v = q.top();            q.pop();            instack[v]=0;        }while(u!=v);        cnt++;    }}

2.Gabow算法


代码:

int cnt=0;vector<int> G[10010];int dfn[10010];int part[10010];            //part[x] : x属于第part[x]个强连通分量int index=0;stack<int> q,q2;void tarjan(int u){    dfn[u]=++index;    q.push(u);    q2.push(u);    for(int i = 0 ; i < G[u].size(); i++)        {            if(!dfn[G[u][i]])                gabow(G[u][i]);             else if(part[G[u][i]] == -1)                while(dfn[q2.top()] > dfn[G[u][i]])     //如果不用part数组记录,那么这里以及接下来的if中就要判断q2是否为空了,否则可能RE                    q2.pop();                    }        if(u == q2.top())        {            int v;            do            {                v = q.top();                q.pop();                part[v]=cnt;            }while(v != u);            q2.pop();            cnt++;        }}


原创粉丝点击