Tarjan

来源:互联网 发布:手机淘宝怎样退换货 编辑:程序博客网 时间:2024/05/16 09:17
int low[N],dfn[N],fa[N];int stack[N];int top,sig,time1;void dfs(int pos){    stack[++top]=pos;    low[pos]=dfn[pos]=++time1;    for(int p=head[pos];p!=-1;p=edge[p].next)    {        int to=edge[p].to;        if(!dfn[to]) dfs(to);        if(!fa[to]) low[pos]=min(low[pos],low[to]);    }    if(low[pos]==dfn[pos])    {        ++sig;        do        {            fa[stack[top]]=sig;        }while(stack[top--]!=pos);    }}void tarjan(int n){    memset(dfn,0,sizeof(dfn));    memset(fa,0,sizeof(fa));    time1=sig=top=0;    for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);}



2-sat专用版#define N 3010vector<int>head[N],rehead[N];vector<int>vs;bool visit[N];int fa[N];void add(int u,int v){    head[u].pb(v);    rehead[v].pb(u);}void dfs(int pos){    visit[pos]=1;    for(int i=0;i<head[pos].size();++i)    {        if(!visit[ head[pos][i] ]) dfs(head[pos][i]);    }    vs.pb(pos);}void redfs(int pos,int sig){    visit[pos]=1;    fa[pos]=sig;    for(int i=0;i<rehead[pos].size();++i)    {        if(!visit[ rehead[pos][i] ]) redfs(rehead[pos][i],sig);    }}void tarjan(int n){    memset(visit,0,sizeof(visit));    vs.clear();    FOR(i,1,n+n) if(!visit[i]) dfs(i);    memset(visit,0,sizeof(visit));    int sig=0;    DSC(i,vs.size()-1,0)    {        if(!visit[ vs[i] ]) redfs(vs[i],sig++);    }}


原创粉丝点击