强连通分量板子

来源:互联网 发布:linux设置防火墙端口 编辑:程序博客网 时间:2024/06/05 03:05

【这道题没有过poj2186,不过二分差错发现不是板子的问题】
还好复习了以下强连通分量!!不然到考场上了还是有可能写错!!

注意

1.因为强连通分量是针对有向图,所以没有什么if(v==fa) continue;的说法
2.else后面一定还要判断if(instk[v]) 非常重要!!这点和双连通分量不同!!

#include<cstdio>#include<cstring>#include<algorithm> using namespace std;const int M=50000+5,N=10000+5;int n,m;int to[M],nxt[M],head[N],etot;int low[N],dfn[N],idc;int stk[N],top,num,beg[N],cnt[N],out[N];bool instk[N];void adde(int u,int v){    to[++etot]=v;    nxt[etot]=head[u];    head[u]=etot;}void tarjan(int u){    stk[++top]=u;    low[u]=dfn[u]=++idc;    instk[u]=1;    for(int i=head[u];i;i=nxt[i]){        int v=to[i];        if(!dfn[v]){            tarjan(v);            low[u]=min(low[v],low[u]);        }        else if(instk[v]) low[u]=min(low[u],dfn[v]);    }    if(dfn[u]==low[u]){        ++num;        while(1){            int x=stk[top--];            beg[x]=num;            cnt[num]++;            instk[x]=0;            if(x==u) break;        }    }}
原创粉丝点击