/yiw

P2272 [ZJOI2007] 最大半连通子图

xie_lzh @ 2022-01-17 16:56:33

在本题的第二篇题解中有着这样一段代码

for(int x=1;x<=n;x++) {
    f[x]=size[x];
    g[x]=1;
    for(int i=Head[x];i;i=Next[i]) {
        int y=ver[i];
        if(belong[x]==belong[y]) continue;
        ADD(belong[x],belong[y]);
    }
}

在其中第二行的对 f数组 的初始化中 按照我的理解应该是对 缩点 后每一个点进行初始化 而不是对 1到 n 的每一个点初始化

我有点不明白 希望有daolao能回答


by CloudyKai @ 2022-02-09 23:37:22

首先我的理解也是这样

然后缩之后的点编号是1到scc,其中scc小于n,所以这么一次就可以把1到scc的新点都初始化f和g,至于剩下的部分程序也不会再用了,不用去管

for循环从1到n主要是为了下面的,把缩点前的图转化为缩点后的图,要枚举缩点前的n个点

所以要规范逻辑的话,前3行和后6行应该分两个for循环写的,只不过为了详略得当合并了一下

隔了二十几天,大佬想必早就想明白了吧(我在写啥

(话说我还没A这道题,来教大佬看题解干嘛)


|