强连通分量(tarjan算法)

来源:互联网 发布:老凤祥网络旗舰店 编辑:程序博客网 时间:2024/06/04 08:57
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#define max 110using namespace std;int par[max],in[max],out[max];int low[max],dnf[max],sta[max],ccount,tot,cnt;//ccount为强连通分量个数bool use[max];vector<int >g[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;i<p;i++)    {        k=g[index][i];        if(!dnf[k])        {            dfs(k);            if(low[index]>low[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);    }}

0 0
原创粉丝点击