【模板】强连通分量

来源:互联网 发布:matlab怎么调用caffe 编辑:程序博客网 时间:2024/06/05 02:43
#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<iostream>#include<string>#include<cstdlib>#include<stack>using namespace std;stack <int> q;int hed[1000005],nex[100005],lb[100005];int dfn[1000005],low[1000005];int block[1000005],pa[1000005];int n,m,lo=0,T=0;void add(int x,int y){    lo++;    nex[lo]=hed[x];    hed[x]=lo;    lb[lo]=y;}void dfs(int x){    dfn[x]=low[x]=++T;    q.push(x);    for(int i=hed[x];i!=0;i=nex[i])    {        if(!dfn[lb[i]])        {          dfs(lb[i]);          low[x]=min(low[lb[i]],low[x]);        }        else if(!block[lb[i]])         low[x]=min(low[x],dfn[lb[i]]);      }    if(low[x]==dfn[x])    {        lo++;        int xx;        while(xx!=x)        {            xx=q.top();q.pop();            block[xx]=lo;        }    }}int main(){    int a,b;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        scanf("%d%d",&a,&b);        add(a,b);    }    lo=0;    for(int i=1;i<=n;i++)     if(dfn[i]==0)    dfs(i);    printf("%d",lo);    return 0;}
原创粉丝点击