• 手工栈


    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竞赛中手工栈的书写

  • 相关阅读:
    Spring Boot 7:配置文件信息读取
    Spring Boot 6:自定义filter
    Spring AOP:Java动态代理和CGlib
    Spring AOP:概念
    设计模式(二)---策略模式
    设计模式(一)--装饰模式
    java并发编程实战笔记
    剑指offer java -查找旋转数组的最小数字
    读书计划
    协议初学
  • 原文地址:https://www.cnblogs.com/zzyer/p/8721223.html
Copyright © 2020-2023  润新知