找环

圆方树:https://www.cnblogs.com/cjyyb/p/9098400.html

1.点双连通分量

找到了一个新的不错的模板

void dfs(int x,int y)
{
    dfn[x]=low[x]=++cnt;
    int ch=0;
    for (rint u=head[x];u;u=e[u].a)
    {
        int v=e[u].b;
        if (v==y) continue;
        if (!dfn[v])
        {
            st[++top2]=v;
            dfs(v,x);
            if (low[v]>=dfn[x])
            {
                iscut[x]=1;
                bcc[++cnt3].clear();
                do{
                    bcc[cnt3].push_back(st[top2]);
                }while (st[top2--]!=v);
                bcc[cnt3].push_back(x);
            }
            if (low[v]<low[x]) low[x]=low[v];
        }
        if (dfn[v]<low[x]) low[x]=dfn[v];
    }
    if (x==1&&ch<=1) iscut[1]=0;
}

缩点双的缩法是 把除割点以外的点双缩一起,割点单独

(好像这个东西就是圆方树。。。)

2.边双连通分量

3.强连通分量

4.仙人掌图找环

void find(ll x,ll y)
{
    do
    {
        st1[++top]=x;
        st2[top]=faqz[x];
        belong[x]=1;
        if (x==y) break;
        x=fa[x];
    }while (1);
}
void dfs(ll x,ll y)
{
    dfn[x]=low[x]=++cnt; fa[x]=y;
    for (rint u=head[x];u;u=e[u].a)
    {
        rint v=e[u].b;
        if (v==y) continue;
        faqz[v]=e[u].c;
        if (!dfn[v]) dfs(v,x);
        if (dfn[v]<dfn[x])
        {
            find(x,v);
        }
    }
}

这么写就可以啦 很简单

5.判断一张图是不是仙人掌

无向图:poj 2793

扫描二维码关注公众号,回复: 3618302 查看本文章

有向图:hdu 3594

6.造一张仙人掌图

猜你喜欢

转载自www.cnblogs.com/yinwuxiao/p/9813811.html
今日推荐