图中连通块的划分

错误的写法

int c[N];//c[i]表示i点属于第几个连通块
dfs(1)//主函数中
void dfs(int u)
{
    if(u>n)return;
    if(st[u])dfs(u+1);
    if(!st[u])
    {
      c[u]=cnt;
      st[u]=1;
    }
    for(int i=h[u];~i;i=ne[i])//遍历所有临点,加入到连通块中去,因为前向星无法处理,a->b,b->c这种情况,所以有问题!
    {
        int j=e[i];
        if(!st[j])
        {
            c[j]=cnt;
            st[j]=1;
        }
        
    }
    cnt++;
    dfs(u+1);
}

蓝书上的写法

st[i]表示i属于第几个连通块,同时起到标记i的作用。
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            cnt++;
            dfs(i);
        }
    }

    void dfs(int u)
    {
        st[u]=cnt;
        for(int i=h[u];~i;i=ne[i])
        {
            int j=e[i];
            if(st[j])continue;
            dfs(j);
        }
    }
posted @ 2020-10-01 11:13  30天CF上蓝!!!  阅读(209)  评论(0编辑  收藏  举报