图的连通性:强连通-Tarjan算法

不早了,先上个模板,做些题再来分析一下;

强连通Tarjan算法+前向星 模板如下:

const int MAXN=110;
const int MAXM=10010;

struct edge
{
    int to,next;
};

edge E[MAXN];
int head[MAXN],Ecou;
int Stack[MAXN],top;
int Belong[MAXN],lfcou;
int Index;
int DFN[MAXN],LOW[MAXN];
bool inStack[MAXN];

void Tarjan(int u)
{
    int v;

    LOW[u]=DFN[u]=++Index;
    Stack[top++]=u;
    inStack[u]=1;
    for(int i=head[u];i!=-1;i=E[i].next)
    {
        v=E[i].to;
        if(!DFN[v])
        {
            Tarjan(v);
            if(LOW[u]>LOW[v])
                LOW[u]=LOW[v];
        }
        else if(inStack[v]&&LOW[u]>DFN[v])
            LOW[u]=DFN[v];
    }
    if(LOW[u]==DFN[u])
    {
        ++lfcou;
        do
        {
            v=Stack[--top];
            inStack[v]=0;
            Belong[v]=lfcou;
        }while(v!=u)
    }
}

void getSCC(int n)
{
    for(int i=1;i<=n;i++)
        if(!DFN[i])
            Tarjan(i);
}

void add_edge(int u,int v)
{
    E[Ecou].to=v;
    E[Ecou].next=head[u];
    head[u]=Ecou++;
}

void init(int n)
{
    Ecou=Index=lfcou=top=0;
    for(int i=1;i<=n;i++)
    {
        inStack[i]=DFN[i]=0;
        head[i]=-1;
    }
}

你可能感兴趣的:(图的连通性:强连通-Tarjan算法)