码迷,mamicode.com
首页 > 其他好文 > 详细

支配树

时间:2020-01-22 21:39:20      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:pre   ==   int   mat   lin   --   tin   dom   void   

\(code:\)

void dfs_dfn(int x)
{
    dfn[x]=++dfn_cnt;
    id[dfn_cnt]=x;
    for(int i=a.head[x];i;i=a.e[i].nxt)
    {
        int y=a.e[i].to;
        if(dfn[y]) continue;
        fa[y]=x;
        dfs_dfn(y);
    }
}
int find(int x)
{
    if(x==fath[x]) return x;
    int tmp=find(fath[x]);
    if(dfn[sdom[val[fath[x]]]]<dfn[sdom[val[x]]])
        val[x]=val[fath[x]];
    return fath[x]=tmp;
}
void tarjan()
{
    for(int i=1;i<=n;++i) sdom[i]=fath[i]=val[i]=i;
    for(int i=dfn_cnt;i>1;--i)
    {
        int x=id[i];
        for(int i=b.head[x];i;i=b.e[i].nxt)
        {
            int y=b.e[i].to;
            if(!dfn[y]) continue;
            find(y);
            if(dfn[sdom[val[y]]]<dfn[sdom[x]])
                sdom[x]=sdom[val[y]];
        }
        c.add(sdom[x],x);
        fath[x]=fa[x];
        x=fa[x];
        for(int i=c.head[x];i;i=c.e[i].nxt)
        {
            int y=c.e[i].to;
            find(y);
            if(sdom[val[y]]==x) idom[y]=x;
            else idom[y]=val[y];
        }
        c.head[x]=0;
    }
    for(int i=2;i<=dfn_cnt;++i)
    {
        int x=id[i];
        if(idom[x]!=sdom[x])
            idom[x]=idom[idom[x]];
    }
    for(int i=2;i<=n;++i) d.add(idom[i],i);
}

支配树

标签:pre   ==   int   mat   lin   --   tin   dom   void   

原文地址:https://www.cnblogs.com/lhm-/p/12229552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!