首页 > 其他 > 详细

tranj模板

时间:2019-09-15 14:19:31      阅读:98      评论:0      收藏:0      [点我收藏+]

割点:

inline void dfs(int x)
{
    int children=0;
    dfn[x]=low[x]= ++m1; 
    for(int i=link[x];i;i=a[i].next)
    {
        int y=a[i].y;
        if(!dfn[y])
        {
            children++;
            f[y]=x;
            dfs(y);
            low[x]=min(low[x],low[y]);
            if(f[x]==-1&&children>=2) vis[x]=1;
            if(f[x]!=-1&&low[y]>=dfn[x]) vis[x]=1;
        }
        else if(f[x]!=y) low[x]=min(low[x],dfn[y]);
    }
}

割边:

inline void dfs(int x)
{
    dfn[x]=low[x]= ++m1;
    for(int i=link[x];i;i=a[i].next)
    {
        int y=a[i].y;
        if(!dfn[y])
        {
            f[y]=x;
            dfs(y);
            low[x]=min(low[x],low[y]);
            if(low[y]>dfn[x])
            {
                ans[++o].x=min(x,y);
                ans[o].y=max(x,y);
            }
        }
        else if(f[x]!=y) low[x]=min(low[x],dfn[y]);
     }
}

强连通分量:

inline void dfs(int x)
{
    dfn[x]=low[x]= ++m1;
    vis[q[++top]=x]=1;
    for(int i=link[x];i;i=a[i].next)
    {
        int y=a[i].y;
        if(!dfn[y])
        {
            dfs(y);
            low[x]=min(low[x],low[y]); 
        }
        else if(vis[y]) low[x]=min(low[x],dfn[y]);
    }
    if(dfn[x]==low[x])
    {
        int k=0;o++;
        while(1)
        {
            if(k==x) break;
            k=q[top--];
            ans[k]=o;
            vis[k]=0;
        }
    }
}

 

tranj模板

原文:https://www.cnblogs.com/gcfer/p/11521993.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!