首页 > 技术文章 > 【模板】无向图的割顶

zhyfzy 2015-03-20 23:40 原文

无向图的割顶:

 

Vector <int> G[] :邻接表存图

Int pre[] :存储时间戳

Int low[] : u及其后代所能连回的最早的祖先的pre值

Int iscut[] : =true表示是割顶,=false不是割顶

Dfs函数在主函数调用时,fa预设为-1。

 

注意初始化:

memset(head,-1,sizeof(head));
edge=0;
dfs_clock=0;
memset(low,0,sizeof(low));
memset(pre,0,sizeof(pre));

 

以下是模板 

vector <int> G[MAXN];
int pre[MAXN],iscut[MAXN],low[MAXN],dfs_clock;
int dfs(int u,int fa)
{
    int lowu=pre[u]=++dfs_clock;
    int child=0;
    for (int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if (!pre[v])
        {
            child++;
            int lowv=dfs(v,u);
            lowu=min(lowu,lowv);
            if (lowv>=pre[u])//如果求桥,去掉等于号
            {
                iscut[u]=true;
            }
        }else
        if (pre[v]<pre[u] && v!=fa)
        {
            lowu=min(lowu,pre[v]);
        }
    }
    if (fa<0 && child==1) iscut[u]=0;
    return low[u]=lowu;
}

 

推荐阅读