强连通分量(tarjan算法)

#include
#include
#include
#include
#include
#define max 110
using namespace std;
int par[max],in[max],out[max];
int low[max],dnf[max],sta[max],ccount,tot,cnt;//ccount为强连通分量个数
bool use[max];
vectorg[max];
int mmax(int a,int b)
{
    int p;
    if(a>b)
        p=a;
    else
        p=b;
    return p;
}
void dfs(int index)
{
    int i,p,k;
    low[index]=dnf[index]=++cnt;
    use[index]=1;
    sta[tot++]=index;
    p=(int)g[index].size();
    for(i=0;ilow[k])
                low[index]=low[k];
        }
        else if(use[k])
        {
            if(low[index]>dnf[k])
                low[index]=dnf[k];
        }
    }
    if(low[index]==dnf[index])
    {
        ccount++;
        while(1)
        {
            tot--;
            use[sta[tot]]=0;
            par[sta[tot]]=ccount;
            if(tot==0||sta[tot]==index)
                break;
        }
    }
    return ;
}
void targin(int n)
{
    memset(use,0,sizeof(use));
    memset(dnf,0,sizeof(dnf));
    memset(low,0,sizeof(low));
    memset(in,0,sizeof(in));
    memset(out,0,sizeof(out));
    cnt=0;
    ccount=0;
    tot=0;
    int i,s=0,j,q;
    int p,t;
    for(i=1;i<=n;i++)
    {
        if(!dnf[i])
            dfs(i);
    }
}

你可能感兴趣的:(强连通分量,图论)