tranj template

Percentage points:

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]);
    }
}

Cutting edge:

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]);
     }
}

Strongly connected components:

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;
        }
    }
}

 

Guess you like

Origin www.cnblogs.com/gcfer/p/11521993.html