手工栈

void tarjan(int x)
{
    int tmp=0;t=0;stack[++tmp]=x;
    dfn[x]=low[x]=++dfs_clock;vis[x]=1;st[++t]=x;cur[x]=point[x];
    while (tmp)
    {
        int x=stack[tmp];
        if (!cur[x])
        {
            --tmp;
            if (dfn[x]==low[x])
            {
                int now=0;++scc;
                while (now!=x)
                {
                    now=st[t--];
                    belong[now]=scc;
                    ++cnt[scc];
                    vis[now]=0;
                }
            }
            if (father[x]) low[father[x]]=min(low[father[x]],low[x]);
            continue;
        }
        int vt=v[cur[x]];
        if (!dfn[vt])
        {
            stack[++tmp]=vt;st[++t]=vt;
            dfn[vt]=low[vt]=++dfs_clock;
            father[vt]=x;vis[vt]=1;
            cur[vt]=point[vt];
        }
        else if (vis[vt]) low[x]=min(low[x],dfn[vt]);
        cur[x]=nxt[cur[x]];
    }
}
void tarjan(int x)
{
    dfn[x]=low[x]=++dfs_clock;vis[x]=1;st[++t]=x;
    for (int i=point[x];i;i=nxt[i])
        if (!dfn[v[i]])
        {
            tarjan(v[i]);
            low[x]=min(low[x],low[v[i]]);
        }
        else if (vis[v[i]])
            low[x]=min(low[x],dfn[v[i]]);
    if (dfn[x]==low[x])
    {
        int now=0;++scc;
        while (now!=x)
        {
            now=st[t--];
            belong[now]=scc;
            ++cnt[scc];
            vis[now]=0;
        }
    }
}
void dfs_1()
{
    int tmp=0;stack[++tmp]=1;
    size[1]=1;h[1]=1;
    for (int i=1;i<=n;++i) cur[i]=point[i];
    while (tmp)
    {
        int x=stack[tmp];
        while (cur[x]&&v[cur[x]]==father[x]) cur[x]=nxt[cur[x]];
        if (!cur[x])
        {
            --tmp;
            if (father[x])
            {
                size[father[x]]+=size[x];
                if (size[x]>size[son[father[x]]]) son[father[x]]=x;
            }
            continue;
        }
        int vt=v[cur[x]];stack[++tmp]=vt;
        father[vt]=x;size[vt]=1;h[vt]=h[x]+1;
        cur[x]=nxt[cur[x]];
    }
}
void dfs_2()
{
    int tmp=0;stack[++tmp]=1;
    top[1]=1;in[1]=++dfs_clock;num[dfs_clock]=a[1];
    for (int i=1;i<=n;++i) cur[i]=point[i];
    while (tmp)
    {
        int x=stack[tmp];
        if (!use[x])
        {
            use[x]=1;
            if (son[x])
            {
                int vt=son[x];
                top[vt]=top[x];in[vt]=++dfs_clock;num[dfs_clock]=a[vt];
                stack[++tmp]=vt;
            }
            continue;
        }
        while (cur[x]&&(v[cur[x]]==father[x]||v[cur[x]]==son[x])) cur[x]=nxt[cur[x]];
        if (!cur[x])
        {
            --tmp;
            out[x]=dfs_clock;
            continue;
        }
        int vt=v[cur[x]];stack[++tmp]=vt;
        top[vt]=vt;in[vt]=++dfs_clock;num[dfs_clock]=a[vt];
        cur[x]=nxt[cur[x]];
    }
}
void dfs_1(int x,int fa)
{
    father[x]=fa;size[x]=1;h[x]=h[fa]+1;
    for (int i=point[x];i;i=nxt[i])
        if (v[i]!=fa)
        {
            dfs_1(v[i],x);
            size[x]+=size[v[i]];
            if (size[v[i]]>size[son[x]]) son[x]=v[i];
        }
}
void dfs_2(int x,int fa)
{
    if (son[fa]==x) top[x]=top[fa];
    else top[x]=x;
    in[x]=++dfs_clock;num[dfs_clock]=a[x];
    if (son[x]) dfs_2(son[x],x);
    for (int i=point[x];i;i=nxt[i])
        if (v[i]!=fa&&v[i]!=son[x])
            dfs_2(v[i],x);
    out[x]=dfs_clock;
}

 

OI竞赛中手工栈的书写

posted @ 2018-04-05 09:18  ws_zzy  阅读(245)  评论(0编辑  收藏  举报